php连接数组具有相同的初始值

时间:2013-04-10 16:27:04

标签: php

这是我的数组

Array
(
    [0] => Array
        (
            [0] => Jan 2010
            [1] => 65.75
        )

    [1] => Array
        (
            [0] => Jan 2010
            [1] => 211.05
        )

    [2] => Array
        (
            [0] => Jan 2010
            [1] => 582.7
        )

    [3] => Array
        (
            [0] => Feb 2010
            [1] => 136.3
        )

    [4] => Array
        (
            [0] => Feb 2010
            [1] => 215.32
        )

    [5] => Array
        (
            [0] => Feb 2010
            [1] => 413.9
        )

    [6] => Array
        (
            [0] => Mar 2010
            [1] => 156.35
        )

    [7] => Array
        (
            [0] => Mar 2010
            [1] => 210.54
        )

    [8] => Array
        (
            [0] => Mar 2010
            [1] => 585.15
        )

    [9] => Array
        (
            [0] => Apr 2010
            [1] => 126.1
        )

    [10] => Array
        (
            [0] => Apr 2010
            [1] => 255.47
        )

    [11] => Array
        (
            [0] => Apr 2010
            [1] => 329.1
        )

    [12] => Array
        (
            [0] => May 2010
            [1] => 109
        )

    [13] => Array
        (
            [0] => May 2010
            [1] => 170
        )

    [14] => Array
        (
            [0] => May 2010
            [1] => 716.7
        )

)

有什么办法可以让所有数组在[0]合并中具有相同的值?我希望它是这样的:

Array[0] = (Jan 2010, 65.75, 211.05, 582.7)
Array[1] = (Feb 2010, 136.3, 215.32, 413.9)

依旧......

4 个答案:

答案 0 :(得分:3)

我能想到的最接近“简单”(阅读:利用本机PHP功能)正在切换到结果的文本键(关联数组)。从数据建模的角度来看,这也是有意义的,因为在您的示例结果数组中,您正在混合“关键”数据和“值”数据(例如,第一个值承担作为set == bad的标签的责任)。诀窍是使用隐式“push”运算符[],它将一个新值附加到数组。

foreach($sourceArray as $currentSubArray) {
  $resultArray[$currentSubArray[0]][] = $currentSubArray[1];
}

您的结果将如下所示:

Array (
  'Jan 2010' => Array (
    0 => 65.75,
    1 => 211.05,
    2 => 582.7,
  )
  ...
)

答案 1 :(得分:1)

这是@ctrahey suggested的变体,它直接在输入数组上运行:

foreach($array as $key => &$entry) {
    list($month, $value) = $entry;
    if (isset($ptr[$month])) {
        $ptr[$month][] = $value;
        unset($array[$key]);
    } else {
        $ptr[$month] = &$entry;
    }
}
unset($ptr);

使用示例数据输出:

Array
(
    [0] => Array
        (
            [0] => Jan 2010
            [1] => 65.75
            [2] => 211.05
            [3] => 582.7
        )

    [3] => Array
        (
            [0] => Feb 2010
            [1] => 136.3
            [2] => 215.32
            [3] => 413.9
        )

    [6] => Array
        (
            [0] => Mar 2010
            [1] => 156.35
            [2] => 210.54
            [3] => 585.15
        )

    [9] => Array
        (
            [0] => Apr 2010
            [1] => 126.1
            [2] => 255.47
            [3] => 329.1
        )

    [12] => Array
        (
            [0] => May 2010
            [1] => 109
            [2] => 170
            [3] => 716.7
        )

)

答案 2 :(得分:0)

这太可怕了,但它有效......

$resarray=Array(
    0 => Array(0 => 'Jan 2010',1 => 65.75),
    1=> Array(0 => 'Jan 2010',1 => 211.05),
    2 => Array(0 => 'Jan 2010',1 => 582.7),
    3 => Array(0 => 'Feb 2010',1 => 136.3),
    4 => Array(0 => 'Feb 2010',1 => 215.32),
    5 => Array(0 => 'Feb 2010',1 => 413.9),
    6 => Array(0 => 'Feb 2010',1 => 156.35),
    7 => Array(0 => 'Feb 2010',1 => 210.54),
    8 => Array(0 => 'Mar 2010',1 => 585.15),
    9 => Array(0 => 'Apr 2010',1 => 126.1),
    10 => Array(0 => 'Apr 2010',1 => 255.47),
    11 => Array(0 => 'Apr 2010',1 => 329.1),
    12 => Array(0 => 'May 2010',1 => 109),
    13 => Array(0 => 'May 2010',1 => 170),
    14 => Array(0 => 'May 2010',1 => 716.7)

    );
$CatArray=array();
$FinArray=array();
$count=count($resarray);
for($i=0;$i<$count;$i++){
    $index=array_search($resarray[$i][0],$CatArray);
    if(is_numeric($index) && $index>=0)
        $FinArray[$index][]=$resarray[$i][1];
    else{
        $CatArray[]=$resarray[$i][0];
        $FinArray[]=array($resarray[$i][0],$resarray[$i][1]);
    }
}
unset($CatArray);
unset($resarray);
$count=count($FinArray);
for($i=0;$i<$count;$i++){
    $resarray[$i]=implode(',',$FinArray[$i]);
}

输出:

Array
(
    [0] => Jan 2010,65.75,211.05,582.7
    [1] => Feb 2010,136.3,215.32,413.9,156.35,210.54
    [2] => Mar 2010,585.15
    [3] => Apr 2010,126.1,255.47,329.1
    [4] => May 2010,109,170,716.7
)

答案 3 :(得分:0)

            actionMerge($inputArray);

            function actionMerge($inputArray){


                $month = array();
                $earn = array();
                $parentKey = 0;
                $callback = function ($value, $key) use (&$month, &$earn, &$parentKey) {
                    if(!is_array($value)){
                        if($key == 0){
                            if(!in_array($value, $month)){

                                array_push($month, $value);
                                $earn[$value] =  array();
                            }
                            $parentKey = $value;
                        }elseif($key == 1){
                                array_push($earn[$parentKey], $value);
                        }
                    }

                };

                array_walk_recursive($inputArray, $callback);

                echo 'You should use this array';
                var_dump($earn); // group money by month, I recommend you to use it


                $Array = array();
                foreach($month as $m){
                    $arr = array($m);
                    $arr  = array_merge($arr, $earn[$m]);
                    array_push($Array, $arr);
                }

                echo '...Intead of array result what you expect';
                var_dump($Array); // your expect result

            }

            ?>

结果如下:

                        //You should use this array
        array (size=5)
          'Jan 2010' => 
            array (size=3)
              0 => float 65.75
              1 => float 211.05
              2 => float 582.7
          'Feb 2010' => 
            array (size=3)
              0 => float 136.3
              1 => float 215.32
              2 => float 413.9
          'Mar 2010' => 
            array (size=3)
              0 => float 156.35
              1 => float 210.54
              2 => float 585.15
          'Apr 2010' => 
            array (size=3)
              0 => float 126.1
              1 => float 255.47
              2 => float 329.1
          'May 2010' => 
            array (size=3)
              0 => int 109
              1 => int 170
              2 => float 716.7
        //...Intead of array result what you expect
        array (size=5)
          0 => 
            array (size=4)
              0 => string 'Jan 2010' (length=8)
              1 => float 65.75
              2 => float 211.05
              3 => float 582.7
          1 => 
            array (size=4)
              0 => string 'Feb 2010' (length=8)
              1 => float 136.3
              2 => float 215.32
              3 => float 413.9
          2 => 
            array (size=4)
              0 => string 'Mar 2010' (length=8)
              1 => float 156.35
              2 => float 210.54
              3 => float 585.15
          3 => 
            array (size=4)
              0 => string 'Apr 2010' (length=8)
              1 => float 126.1
              2 => float 255.47
              3 => float 329.1
          4 => 
            array (size=4)
              0 => string 'May 2010' (length=8)
              1 => int 109
              2 => int 170
              3 => float 716.7