compact

(PHP 4, PHP 5)

compact --  Создать массив, содержащий названия переменных и их значения

Описание

array compact ( mixed varname [, mixed ...] )

compact() принимает переменное число параметров. Любой из параметров может быть либо строкой, содержащей название переменной либо массивом названий переменных. Массив может содержать вложенные массивы названий переменных; функция compact() обрабатывает их рекурсивно.

Для каждого из параметров, compact() смотрит, существует ли переменная с таким именем в текущей символьной таблице и добавляет в результирующий массив элемент, ключ которого содержит название переменной, а значение, соответствующее этому ключу, значение переменной. Коротко говоря, действия этой функции противоположны действиям функции extract(). Она возвращает результирующий массив со всеми переменными, добавленными туда.

Если переменной, с именем, соответствующем переданной строке не существует, такая строка будет просто проигнорирована.

Пример 1. Пример использования compact()

<?php
$city 
= "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", "nothing_here", $location_vars);
?>

После этого значение $result будет:

Array
(
   [event] => SIGGRAPH
   [city] => San Francisco
   [state] => CA
)

См. также extract().



compact
mijllirg at wearethedotin dot com
17-Nov-2005 11:38
You might could think of it as ${$var}.  So, if you variable is not accessible with the ${$var} it will not working with this function.  Examples being inside of function or class where you variable is not present.

<?php
$foo
= 'bar';

function
blah()
{
  
// this will no work since the $foo is not in scope
  
$somthin = compact('foo'); // you get empty array
}
?>

PS: Sorry for my poor english...
hericklr at gmail dot com
13-Jun-2005 08:43
The compact function doesn't work inside the classes or functions.
I think its escope is local...
Above it is a code to help about it.
Comments & Suggestions are welcome.
PS: Sorry for my poor english...

<?php

  
function x_compact()
   {    if(
func_num_args()==0)
       {    return
false; }
      
$m=array();

       function
attach($val)
       {    global
$m;
           if((!
is_numeric($val)) && array_key_exists($val,$GLOBALS))
           {   
$m[$val]=$GLOBALS[$val];}
       }

       function
sub($par)
       {    global
$m;
           if(
is_array($par))
           {    foreach(
$par as $cel)
               {    if(
is_array($cel))
                   {   
sub($cel); }
                   else
                   {   
attach($cel); }
               }
           }
           else
           {   
attach($par); }
           return
$m;
       }

       for(
$i=0;$i<func_num_args();$i++)
       {   
$arg=func_get_arg($i);
          
sub($arg);
       }

       return
sub($arg);
   }
?>
pillepop2003 at yahoo dot de
22-Nov-2004 12:26
Use the following piece of code if you want to insert a value into an array at a path that is extracted from a string.

Example:
You have a syntax like 'a|b|c|d' which represents the array structure, and you want to insert a value X into the array at the position $array['a']['b']['c']['d'] = X.

<?
  
function array_path_insert(&$array, $path, $value)
   {
      
$path_el = split('\|', $path);
      
      
$arr_ref =& $array;
      
       for(
$i = 0; $i < sizeof($path_el); $i++)
       {
          
$arr_ref =& $arr_ref[$path_el[$i]];
       }
      
      
$arr_ref = $value;
   }

  
$array['a']['b']['f'] = 4;
  
$path  = 'a|b|d|e';
  
$value = 'hallo';
  
  
array_path_insert($array, $path, $value);

  
/* var_dump($array) returns:

   array(1) {
     ["a"]=>
     &array(1) {
       ["b"]=>
       &array(2) {
         ["f"]=>
         int(4)
         ["d"]=>
         &array(1) {
           ["e"]=>
           string(5) "hallo"
         }
       }
     }
   */

?>

Rock on
Philipp
rlynch at ignitionstate dot com
27-Jan-2000 12:43
It should be noted that PHP will simply skip any strings that are not set:

<?php
  $foo
= 4;
 
$bar = 3;
 
$result = compact('foo', 'bar', 'baz');
?>

will result in:
('foo' => 4, 'bar' => 3)
'baz' is simply ignored.

<asortcount>
 Last updated: Tue, 15 Nov 2005