PHP数组问题 - 分组数组

时间:2015-07-23 13:59:45

标签: php arrays

我试图转换一些数组值(实际上是组),但我不知道该怎么做。

我有这样的事情:

[
 {
  "nsr": "000086310",
  "type": "3",
  "date": "2015-07-18",
  "time": "00:06",
  "pis": "12138790985"
 },
 {
  "nsr": "000086313",
  "type": "3",
  "date": "2015-07-18",
  "time": "00:33",
  "pis": "16073736879"
 },
 {
  "nsr": "000086316",
  "type": "3",
  "date": "2015-07-18",
  "time": "00:58",
  "pis": "16634402451"
 },
 {
  "nsr": "000086316",
  "type": "3",
  "date": "2015-07-19",
  "time": "00:58",
  "pis": "98127981729"
 },
 {
  "nsr": "000086316",
  "type": "3",
  "date": "2015-07-19",
  "time": "00:58",
  "pis": "12398712938"
 }
]

我想转换成这个:

[
 "date" : "2015-07-18",
 "pis" : [
     "12138790985",
     "16073736879",
     "16634402451"
  ]
],
[
 "date" : "2015-07-19",
 "pis" : [
     "98127981729",
     "12398712938"
  ]
]

我试着这样做:

    public function index()
    {
        $this->setTxtData('../../txt_files/CAP  3 18 07 2015 FABRICA.txt');
        $txtdata = $this->getTxtData();

        $dataToCompare = array();

        foreach($txtdata as $ponto){
            $time = $ponto['time'];
            $date = $ponto['date'];
            $pis = $ponto['pis'];

//            $dataToCompare = array();
//            if(strpos($ponto['pis'], '00000000000') === false){
//                $pis_temp[][''] = $ponto['pis'];
//            }

            if(isset($dataToCompare)){
                foreach($dataToCompare as $dateToSet){
                    if($dateToSet['data'] == $date){
                        $dateToSet['pis'][] = $pis;
                    }
                    else{
                        $dateToSet['data'] = $date;
                        $dateToSet['pis'][] = $pis;
                    }
                }
            }
            else{
                $dataToCompare = array(
                    [
                        'data' => $date,
                        'pis' => array($pis)
                    ]
                );
            }


            $funcionario_id = DB::table('funcionario')
                ->select('id')
                ->where('pis_pasep', '=', $pis)
                ->pluck('id');

            if($funcionario_id !== null){

                $validate = DB::table('horas_trabalho')
                    ->select('id')
                    ->where('hora', '=', $time)
                    ->where('data', '=', $date)
                    ->where('funcionario_id', '=', $funcionario_id)
                    ->pluck('id');

                if($validate === null){
                    DB::table('horas_trabalho')
                        ->insert([
                            'hora' => $time,
                            'data' => $date,
                            'funcionario_id' => $funcionario_id
                        ]);
                }
            }
        }

        //-------------------------------------Lógica para faltas-----------------------------------


        /**
         * Pega o pis
         */
        $db_all_funcionarios = DB::table('funcionario')
            ->select('pis_pasep')
            ->where('pis_pasep', '!=', 0)
            ->get();

        foreach($db_all_funcionarios as $pis){
            if(strpos($pis->pis_pasep, '00000000000') !== true){
                $global_pis[] = $pis->pis_pasep;
            }
        }

//        $faltantes = array_diff($pis_temp, $global_pis);

//        foreach($faltantes as $faltante){
//            DB::table('falta')
//                ->insert([
//                   'data' => date('2015-07-16')
//                ]);
//        }

//        $ponto_db[] = DB::table('horas_trabalho')
//            ->join('funcionario', 'horas_trabalho.funcionario_id', '=', 'funcionario.id')
//            ->select('funcionario.nome', 'horas_trabalho.hora', 'horas_trabalho.data')
//            ->get();



        return $txtdata;


    }

3 个答案:

答案 0 :(得分:0)

我在您的文件名中看到了日期,并认为您想要将所有实体分组:

$dataToCompare = array(
  'date' => $txtData[0]['date'],
  'pis' => array_map(function($el){return $el['pis'];}, $txtData)
);

对于多个日期:

$hash = array();
foreach ($txtData as $entity) {
  if (!isset($hash[$entity['date']])) $hash[$entity['date']] = array();
  $hash[$entity['date']][] = $entity['pis'];
}
$result = array();
foreach($hash as $date=>$pis) {
  $result[] = array('date'=>$date, 'pis'=>$pis);
}

答案 1 :(得分:0)

这可能有点草率,但它确实起作用了。或者无论如何,它在示例中都可以正常工作:

<?php
$array = array(
    0 => array(
      "nsr" => "000086310",
      "type" => "3",
      "date" => "2015-07-18",
      "time" => "00:06",
      "pis" => "12138790985"
     ),
    1 => array(
      "nsr" => "000086313",
      "type" => "3",
      "date" => "2015-07-18",
      "time" => "00:33",
      "pis" => "16073736879"
     ),
     2 => array(
      "nsr" => "000086316",
      "type" => "3",
      "date" => "2015-07-18",
      "time" => "00:58",
      "pis" => "16634402451"
     )
 );
$newarray = array();
$pis = array();
foreach($array as $part){
        array_push($pis,$part['pis']);
        $newarray = array(
            "date" => $part['date'],
            "pis" => $pis
        );


}
var_dump($newarray);
?>

答案 2 :(得分:0)

$array = json_decode($str, true);

// make array date => pis
$tmp = array();
foreach ($array as $item) {
   if (!isset($tmp[$item['date']])) $tmp[$item['date']]['pis'] = array(); 
   $tmp[$item['date']]['pis'][] = $item['pis'];
}

// Than move date from key to item
$result = array();
foreach($tmp as $k=>$v) 
  $result[] = array('date' => $k, 'pis' => $v['pis']);
print_r($result);