代码之家  ›  专栏  ›  技术社区  ›  Ricardo

仅将某些数组键合并并分组到新数组中

  •  1
  • Ricardo  · 技术社区  · 6 年前

    我有一个 foreach 循环 if 语句,该语句根据字符串包含的内容创建数组。

    foreach ($dataArray2 as $item) {
        $items = [];
        if(strpos($item, 'your date is') !== false)
        {
            //Converting 22052018 to 2018-05-22
            $month_words = ["may"];
            $month_numbers   = ["05"];
            $item = str_replace($month_words, $month_numbers, $item);
            $item = preg_replace('/[^0-9]/', '', $item);
            $insertion = "-";
            $index = 2;
            $index2 = 5;
            $item = substr_replace($item, $insertion, $index, 0);
            $item = substr_replace($item, $insertion, $index2, 0);
            $time = strtotime($item);
            $date = date('Y-m-d', $time);
    
            $items['date']= $date;
    
        } else if (strpos($item, 'hat') !== false) {
    
            $item = str_replace('.', '', $item);
            $items['hat'] = $item;
    
        } else {
    
            $items['tshirt'] = $item;
    
        }
    
        $dataArr[] = array_filter($items);
    
    }
    
    echo '<pre>';
    print_r($dataArr);
    echo '</pre>';
    

    数组如下:

        [0] => Array
            (
                [date] => 2018-05-22
            )
    
        [1] => Array
            (
                [hat] => blue
            )
    
        [2] => Array
            (
                [tshirt] =>  white
            )
    
        [3] => Array
            (
                [hat] =>  black 
            )
    
        [4] => Array
            (
                [tshirt] => cyan
            )
    
        [5] => Array
            (
                [date] => 2018-05-21
            )
    
        [6] => Array
            (
                [hat] =>  red
            )
    
        [7] => Array
            (
                [tshirt] => blue
            )
    

    我需要它看起来像:

    [0] => Array
        (
            [0] => Array (
                    [date] => 2018-05-22,
                    [hat] => blue,
                    [tshirt] =>  white,
                    [hat] =>  black,
                    [tshirt] =>  cyan
                )
    
            [1] => Array
                (
                    [date] => 2018-05-21
                    [hat] => red,
                    [tshirt] =>  blue,
                )
    )
    

    编辑: var_export 输入数组的格式:

    array (
      0 => 'your date is 22 may 2018, Tuesday.',
      1 => 'hat: blue.',
      2 => 'tshirt: white',
      3 => 'hat: black.',
      4 => 'tshirt: cyan',
      5 => 'your date is 21 may 2018, Tuesday.',
      6 => 'hat: red.',
      7 => 'tshirt: blue',
    

    编辑2:如何分解内部数组 content 分为x2块,如下所示:

    Array
    (
        [0] => Array
            (
                [date] => 2018-05-22
                [content] => Array
                    (
                        [0] => Array
                            (
                                [0] => blue
                                [1] => white
                            )
    
                        [1] => Array
                            (
                                [0] => black
                                [1] => cyan
                            )
    
                        [2] => Array
                            (
                                [0] => red
                                [1] => blue
                            )
                    )
            )
    
        [1] => Array
            (
                [date] => 2018-05-21
                [content] => Array
                    (
                        [0] => Array
                            (
                                [0] => blue
                                [1] => white
                            )
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Andreas    6 年前

    此方法创建一个可能的数组。
    代替regex来解析日期,我使用更轻的日期()。
    由于tshirt和hats是“相同的”,所以我使用相同的方法来解析它们。

    $arr = array (
        0 => 'your date is 22 may 2018, Tuesday.',
        1 => 'hat: blue.',
        2 => 'tshirt: white',
        3 => 'hat: black.',
        4 => 'tshirt: cyan',
        5 => 'your date is 21 may 2018, Monday.',
        6 => 'hat: red.',
        7 => 'tshirt: blue',
    );
    
    $i =-1;
    foreach($arr as $item){
        if(strpos($item, 'your date is') !== false){
            $i++;
            $res[$i]['date'] = date("Y-m-d", strtotime(str_replace("your date is ", "", $item)));
        }else{
            list($key, $val) = explode(": ", $item);
            $res[$i][$key][] = rtrim($val, ".");
        }
    }
    
    
    var_dump($res);
    

    输出:

    array(2) {
      [0]=>
      array(3) {
        ["date"]=>
        string(10) "2018-05-22"
        ["hat"]=>
        array(2) {
          [0]=>
          string(4) "blue"
          [1]=>
          string(5) "black"
        }
        ["tshirt"]=>
        array(2) {
          [0]=>
          string(5) "white"
          [1]=>
          string(4) "cyan"
        }
      }
      [1]=>
      array(3) {
        ["date"]=>
        string(10) "2018-05-21"
        ["hat"]=>
        array(1) {
          [0]=>
          string(3) "red"
        }
        ["tshirt"]=>
        array(1) {
          [0]=>
          string(4) "blue"
        }
      }
    }
    

    https://3v4l.org/1F7OU

    编辑我也更正了你的日期。5月21日和22日不能是星期二。