compact

(PHP 4, PHP 5)

compact --  建立一个数组,包括变量名和它们的值

说明

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

compact() 接受可变的参数数目。每个参数可以是一个包括变量名的字符串或者是一个包含变量名的数组,该数组中还可以包含其它单元内容为变量名的数组, compact() 可以递归处理。

对每个参数,compact() 在当前的符号表中查找该变量名并将它添加到输出的数组中,变量名成为键名而变量的内容成为该键的值。简单说,它做的事和 extract() 正好相反。返回将所有变量添加进去后的数组。

任何没有变量名与之对应的字符串都被略过。

Gotcha: 因为可变变量也许不能在函数内部用于 PHP 的超全局数组,此时不能将超全局数组传递入 compact() 中。

例子 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()


add a note add a note User Contributed Notes
mijllirg at wearethedotin dot com
18-Nov-2005 03: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 11: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
23-Nov-2004 04: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 04: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.