Tengo este código PHP que formatea la matriz para mí,

    $data  = $dataQuery->fetchAll(PDO::FETCH_ASSOC);
    if(count($data)){
        $data_arr=array();
        $data_arr["records"]=array();
        $data_arr["records"] = $data;
    return $response
                ->withHeader('Content-Type','application/json')
                ->withJson($data_arr, 200); 
    }

Y mi matriz está en formato,

"records": [
{
"ID": "1",
"LOCATION": "LOC1#LOC2#LOC3",
"TIMEFRAME": "1601-1650",
"TYPE": "mythological#genre#portrait"
},
{
"ID": "2",
"LOCATION": "LOC2",
"TIMEFRAME": "1851-1900",
"TYPE": "landscape"
}
]

Y estoy tratando de formatear esto como sigue explotando todos los #

"records": [
{
"ID": "1",
"LOCATION": [{LOC1, LOC2, LOC3}],
"TIMEFRAME": "1601-1650",
"TYPE": [{mythological, genre, portrait}]
},
{
"ID": "2",
"LOCATION": "LOC2",
"TIMEFRAME": "1851-1900",
"TYPE": "landscape"
}
]

Me gusta esto,

    //$data  = $dataQuery->fetchAll(PDO::FETCH_ASSOC);
    if($count['COUNT']>0/* &&count($data) */){
        $data_arr=array();
        $data_arr["records"]=array();

        //$data_arr["records"] = $data;
        while ($row = $dataQuery->fetch(PDO::FETCH_ASSOC)){
            extract($row);
            $row_array=array();
            foreach ($row as $row_el){ 
                array_push($row_array, explode('#', $row_el));
            } 
            array_push($data_arr["records"], $row_array);
        }

    return $response
                ->withHeader('Content-Type','application/json')
                ->withJson($data_arr, 200); 
    }

Pero esto está generando el siguiente resultado,

"records":[ 
   [ 
      [ 
         "1"
      ],
      [ 
         "LOC1",
         "LOC2",
         "LOC3"
      ],
      [ 
         "1601-1650"
      ],
      [ 
         "mythological",
         "genre",
         "portrait"
      ]
   ],
   [ 
      [ 
         "2"
      ],
      [ 
         "LOC2"
      ],
      [ 
         "1851-1900"
      ],
      [ 
         "landscape"
      ]
   ]
]

Estoy captando esta respuesta en TypeScript / JavaScript, por lo que también puedo formatear esto en el lado del cliente.

0
Mercurial 20 oct. 2019 a las 09:55

1 respuesta

La mejor respuesta

Aunque no estoy seguro de si no sería más fácil apuntar al valor particular individualmente en lugar de procesar el registro de who.

Básicamente, debe asegurarse de devolver los datos con la clave original, así como con los datos.

La última parte es que si solo hay 1 elemento (como en "ID": "1",), deje de ser una matriz asignándole el valor original nuevamente ...

foreach ($row as $key => $row_el){ 
    $expand = explode('#', $row_el);
    if ( count($expand) == 1 )  {
        $expand = $row_el;
    }
    $row_array[$key] = $expand;
} 

Código actualizado para más niveles de codificación ...

$SQL_RE=array(
    "COUNT" => "5",
    "FORM" => "1&#painting",
    "SCHOOL" => "1&#German",
    "LOCATION" => "1&#Alte Pinakothek, Munich##2&#Kunsthistorisches Museum, Vienna##3&#Private collection",
    "TIMEFRAME" => "1&#1601-1650",
    "TYPE" => "1&#mythological##2&#genre##3&#portrait");

$row_array = [];
foreach ($SQL_RE as $key => $row_el){
    $expand2 = [];
    $l2 = [];
    $expand = explode('##', $row_el);
    foreach ( $expand as $key2 => $element2 )    {
        $expand2 = explode("&#", $element2 );
        if ( count($expand2) == 1 )  {
            $l2[$key2] = $element2;
        }
        else {
            $l2[$expand2[0]] = $expand2[1];
        }
    }
    if ( count($l2) == 1 && count($expand2) != 2 )  {
        $l2 = $row_el;
    }
    $row_array[$key] = $l2;
} 

print_r($row_array);
1
Nigel Ren 20 oct. 2019 a las 11:44