数组array, 变量要加$

  1. 注意: value没有限制, 但是, key必须是整数或者字符串.

  2. 最通常的数组赋值方法:

    //我们日常使用的数组初始化方式.
    $arr= [
      "foo" => "bar",
      "bar" => "foo",
       4=> 'jan', //下标4, 
       361,//下标5, 下一个元素的下标取决于当前最大的下标. 
    ];
    
  3. 最常用的遍历方法

    foreach($array as $item){
      echo $item;
    }
    foreach($array as $key=>$value){}
    while($item=each($array)){}
    while(list($key, $value)=each($array)){}
    //下面两个方法直接反复使用也是可以遍历的.
    $fruit = array_shift($stack);
    $each=each($stack);
    
  4. 竟然有三种赋值方法

    // 前面这三种可能会引起问题, 如果这个变量曾经定义过的话.
    // 因为string 中的字符可以通过一个从 0 开始的下标,用类似 array 结构中的方括号包含对应的数字来访问和修改,比如 $str[42]。可以把 string 当成字符组成的 array
    
    // 第一种, 直接赋值.
    $xxx[]="hhh"; //key 0
    $xxx[]="hhhh"; // key 1
    $xxx[]="hhhhh"; // key 2
    // 第二种, 直接赋值, 并且指定索引下标
    $xx[1]="hhhh"; //这样就从1开始了.
    $xx[2]="hhhhh";
    $x[]        = 4;        // key will be 3
    // 或者创建一个关联数组, 
    $x['lh0']="hhh";
    $x['mh1']="hhhh";
    $x['hh2']="hhhhh";
    $x[]        = 4;        // key will be 0
    // 用array的唠叨丑陋模式
    $yxxx=array(
      'hhh', //key 0
      'hhhh', //key 1
      'hhhhh' //key 2
    );
    $xzxx=array(
      'lh'=> 'hhh',  // =>这么神奇的符号, 就这么一个作用哈. 
      'mh'=>'hhhh',
      'hh'=> 'hhhhh',
      4  ,      // key will be 0
      '6'=> 'xxxx', //key 6
      312, //key 7, 因为之前最大的key是6
    );
    // 自 PHP 5.4 起 有了新的不唠叨格式, 貌似这个是最不唠叨格式.
    $arr= [
        "foo" => "bar",
        "bar" => "foo",
    ];
    //举个最全的例子:
    $switching = [         10, // key = 0
       5 =>  6,
       3 =>  7, 
       'a' =>  4,
       11, // key = 6 (maximum of integer-indices was 5)
       '8' =>  2, // key = 8 (integer!)
       '02' => 77, // key = '02'
       0 => 12  // the value 10 will be overwritten by 12
    ];
    
  5. 关于赋值, 添加, 删除, 就比较有趣了.

    $array = array( //key只能是整数或者字符串, 并且都会被尽量转换为整形. '1'和1对于key而言是一样的.
        1    => "a",
        "1"  => "b",
        1.5  => "c",
        true => "d",
    );
    var_dump($array);//因为类型强制转换, 所以最终这个数组就是
    $array = [ 1 => 'd'];// unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数。
    $arr = array(5 => 1, 12 => 2);
    $arr[] = 56;    // This is the same as $arr[13] = 56;
                    // at this point of the script
    $arr["x"] = 42; // This adds a new element to
                    // the array with key "x"
    unset($arr[5]); // This removes the element from the array, 
    unset($arr);    // This deletes the whole array
    // 创建一个简单的数组
    $array = array(1, 2, 3, 4, 5);
    print_r($array);
    // 现在删除其中的所有元素,但保持数组本身不变:
    foreach ($array as $i => $value) {  // foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
        unset($array[$i]);
    }
    print_r($array);
    // 添加一个单元(注意新的键名是 5,而不是你可能以为的 0)
    $array[] = 6;
    print_r($array);
    // 重新索引:
    $array = array_values($array);
    $array[] = 7;
    print_r($array);
    
  6. 可以传引用

    $arr1 = array(2, 3);
    $arr2 = $arr1;
    $arr2[] = 4; // $arr2 is changed,
                 // $arr1 is still array(2, 3)            
    $arr3 = &$arr1;
    $arr3[] = 4; // now $arr1 and $arr3 are the same
    
  7. 数组的相关函数

      $a; # 这是一个数组.
    foreach($a as $k=>$v){
      $k; # 就是数组中某一项的key
      $v; # 就是某一项的值.
    }
    count($a); # $a里面有多少项.
    each($a);  # 拿出一项, 指针向前移动一格.
    reset($a); # 指针回到开头.
    while(list($k, $v)=each($a)){ } # 赋值. 这个和foreach几乎一样啊.
    $_GET["name"]; # 拿到http get方法传递的name值.
    $_POST["name"]; # 和get类似, post方法.
    

数组变字符串

  1. 把array变成字符串, 其实很简单 json_encode就可以了.
  2. print_r($t, true), 第二个参数为true, 这个函数就会返回$t的字符串.

去除重复

两个办法:

  1. array_unique(), 移除重复, 但是, 对于大数组会比较慢.

  2. array_flip(), 交换建和值, 然后, 键不能重复, 因此, 就去除了重复.

    /* 创建一个包含重复值的,一共四个元素的数组 */
    $array = array('green','blue','orange','blue');
    
    /* 翻转数组,你将会得到唯一键值的数组
            array('green'=>0,'blue'=>1,'orange'=>2); */
    $array = array_flip($array);
    
    /* 然后再翻转一次,将键和值重新放置,然后得到数组:array(0=>'green',1=>'blue',2=>'orange'); */
    $array = array_flip($array); //此时数组的数字索引有可能是断的.
    /* 使用array_merge()函数修复数字键值*/
    $array = array_merge($array); //这一步不是必须的, 取决于两点: 1. 你的数组是数字键值吗? 2. 连续的数字键值对你有意义吗? 如果是多维数组的一个子组, 那么原始的断的索引更有意义, 比如正则preg_match_all的结果数组, 就不应该做这一步. 因为这一步会导致结果的混乱.
    //去重之后可以看看数组的尺寸是否着呢的降低了.
    echo count($array);
    
  3. 访问元素

    //方括号和花括号可以互换使用来访问数组单元, 例如 
    $arr[42];
    $arr{42};// 效果相同。
    function getArray() {
        return array(1, 2, 3);
    }
    $secondElement = getArray()[1];// on PHP 5.4
    $tmp = getArray(); // 老办法
    $secondElement = $tmp[1];
    list(, $secondElement) = getArray(); // 这样也行
    echo "Bad: " . $array['$i'] . "\n"; //这里错在给变量加单引号, 导致不认识这个变量.
    echo "Good: " . $array[$i] . "\n";
    echo "Bad: {$array['$i']}\n";
    echo "Good: {$array[$i]}\n"; //这个花括号的作用和.连接字符串是一样的.
    1. 表示{}里面的是一个变量  ,执行时按照变量来处理
    2. 在字符串中引用变量使用的特殊包括方式这样就可以不使用.运算符从而减少代码的输入量了
    3. 防止变量名和后面的字符串连在一起
    

each方法的坑

$country = each($mifengwo);
key($country); //这个方法返回的值就不是本来数组元素的键值了. 而是数字序号了. 因为each之后变成了这个样子:
array(4) {
  [1]=>
  string(5) "10183"
  ["value"]=>
  string(5) "10183"
  [0]=>
  string(5) "japan"
  ["key"]=>
  string(5) "japan"
}
//因此需要下面这个方法来取键值.
$country['key']
或者直接: 
list($key, $value)=each($array)