散分啰从数据库读取数据,多数为一个行列整齐的二维数组,姑且叫它做矩阵数组吧
当读取后用php计算涉及很多纵向计算(例如对某字段求和),我看很多人都习惯 $array[记录][字段],其实读取时就应该想好怎样分配数组一维和二维的key有时获取的矩阵数组格式固定了,例如来自某个API,我看到不少人还按着记录去求二维的值,更有甚者还用递归,看着真累,把行列交换一下再计算多方便啊squareArray.php<?php
class squareArray
{
public function swapRowCol($inArr)
{
$mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
foreach($inArr as $key => $value) { $temArr = new ArrayIterator($value); $mit->attachIterator($temArr, $key); }
$arr = array();
foreach($mit as $item) array_push($arr,$item);
if (isset($inArr[0])) $arr = array_combine(array_keys($inArr[0]),$arr);
return $arr;
} public function swapRowColWithKey($inArr)
{
foreach($inArr as $k1=>$v1) foreach($v1 as $k2=>$v2) $arr[$k2][$k1] = $v2;
return $arr;
} public function intersect1st($arr1, $arr2, $key)
{
$arr[$key] = array_intersect($arr1[$key], $arr2[$key]);//match source's $key with target
  foreach($arr1 as $k=>$v) { if ($k == $key) continue; $arr[$k] = array_intersect_key($v, $arr[$key]); }
return $arr;
} public function intersect2nd($arr1, $arr2, $key)
{
foreach($arr2 as $v) $tmpArr[] = $v[$key];
foreach($arr1 as $k=>$v) if(in_array($v[$key], $tmpArr)) $arr[$k] = $v;
return $arr;
}}
?>
squareArray.sample.php
这是使用方法,写得简单了点,只是为了怕自己太久没用忘了,提醒一下写法而已<?php
include('squareArray.php');
//$array = array('id' => array('001', '002', '003'),'name' => array('张三', '李四', '王五'),'age' => array(22, 23, 11));  
$array = array(array('id' => '001', 'name' => '张三', 'age' => 22),array('id' => '002', 'name' => '李四', 'age' => 23),array('id' => '003', 'name' => '王五', 'age' => 11));  $a = array(
  0 => array('action_id' => 3),
  1 => array('action_id' => 2),
  2 => array('action_id' => 1),
  3 => array('action_id' => 7),
  4 => array('action_id' => 11),
);$b = array(
  0 => array('action_id' => 3, 'type' => 0, 'order_num' => 67),
  1 => array('action_id' => 2, 'type' => 0, 'order_num' => 66),
  2 => array('action_id' => 1, 'type' => 0, 'order_num' => 65),
  3 => array('action_id' => 7, 'type' => 0, 'order_num' => 64),
  8 => array('action_id' => 14, 'type' => 0, 'order_num' => 40),
  13 => array('action_id' => 11, 'type' => 0, 'order_num' => 30),
);//交换矩阵数组一维和二维键值例子
$obj=new squareArray();
$arr=$obj->swapRowCol($array);
var_export($arr);//交换矩阵数组一维和二维键值例子(保留数值键名)
$arr=$obj->swapRowColWithKey($b);
var_export($arr);//根据指定key求二维数组矩阵数组交集(一维key)
$key='action_id';
$aa=$obj->swapRowCol($a);
$bb=$obj->swapRowCol($b);
$arr = $obj->intersect1st($bb, $aa, $key);//$b和$a自己定义吧,我懒得输入了
$arr=$obj->swapRowCol($arr);
var_export($arr);//根据指定key求二维数组矩阵数组交集(二维key)
$key='action_id';
$arr = $obj->intersect2nd($b, $a, $key);//$b和$a自己定义吧,我懒得输入了
var_export($arr);
exit;?>
如果发现bug就自己处理吧……

解决方案 »

  1.   

    巢状数组是啥样的?
    不考虑key的swapRowCol方法为啥比考虑key的swapRowColWithKey还复杂呢?
    我经常这么用
        public function swapRowCol($inArr)
        {
            return call_user_func_array('array_merge_recursive', $inArr);
        }
      

  2.   


    呵呵,如果输出正确当然你这个好
    我当时是顺便练习SPL写的,之后就基本没用过swapRowCol(),一直都是用swapRowColWithKey(),所以就没再考虑优化了 
      

  3.   

    巢状我没理解错的话就是阵列中还嵌套阵列(cell arrays? nested arrays?),维度细致化来说就是超出二维了
      

  4.   

    巢状我没理解错的话就是阵列中还嵌套阵列(cell arrays? nested arrays?),维度细致化来说就是超出二维了

    那如果不考虑key的话用#5方法不是正好
      

  5.   

    接触php一年了,第一次看到这个对象
    $mit = new MultipleIterator(MultipleIterator::MIT_KEYS_ASSOC);
    咋整啊......
      

  6.   


    这句啥意思自己查查手册 SPL一章
      

  7.   

    php5.5 增加了一个array_column函数,这个可以用用
      

  8.   

    我也是昨天中午答人家一个问题查手册才看到,感觉从没用过,细看才知道新增加的
    这咚咚不错,减少不少filter和遍历
      

  9.   

    array_column — 返回数组中指定的一列
    自己写一个也很容易
    $b = array(
      0 => array('action_id' => 3, 'type' => 0, 'order_num' => 67),
      1 => array('action_id' => 2, 'type' => 0, 'order_num' => 66),
      2 => array('action_id' => 1, 'type' => 0, 'order_num' => 65),
      3 => array('action_id' => 7, 'type' => 0, 'order_num' => 64),
      8 => array('action_id' => 14, 'type' => 0, 'order_num' => 40),
      13 => array('action_id' => 11, 'type' => 0, 'order_num' => 30),
    );
    print_r(array_column($b, 'action_id'));function array_column($ar, $key) {
      return array_map(function($item) use ($key) { return @$item[$key]; }, $ar);
    }Array
    (
        [0] => 3
        [1] => 2
        [2] => 1
        [3] => 7
        [8] => 14
        [13] => 11
    )
      

  10.   

    求 楼主帮助  php sql注入漏洞 不会。。