我是PHP的初学者,我需要一些帮助来优化我巨大的代码...
我有这样的阵列:
Array
(
[OD583091439BR] => Array
(
[0] => Array
(
[date] => 25/11/2020
[hour] => 13:38
[location] => FLORIANOPOLIS/SC
[action] => Objeto entregue ao destinatário
[message] => Objeto entregue ao destinatário
[change] => há 152 dias
)
[1] => Array
(
[date] => 25/11/2020
[hour] => 11:48
[location] => FLORIANOPOLIS/SC
[action] => Objeto saiu para entrega ao destinatário
[message] => Objeto saiu para entrega ao destinatário
[change] => há 152 dias
)
[2] => Array
(
[date] => 24/11/2020
[hour] => 07:34
[location] => SAO JOSE / SC
[action] => Objeto em trânsito - por favor aguarde
[message] => Objeto em trânsito - por favor aguarde de Unidade de Tratamento em SAO JOSE / SC para Unidade de Distribuição em FLORIANOPOLIS / SC
[change] => há 153 dias
)
[3] => Array
(
[date] => 23/11/2020
[hour] => 21:14
[location] => PORTO ALEGRE / RS
[action] => Objeto em trânsito - por favor aguarde
[message] => Objeto em trânsito - por favor aguarde de Unidade de Tratamento em PORTO ALEGRE / RS para Unidade de Tratamento em SAO JOSE / SC
[change] => há 154 dias
)
[4] => Array
(
[date] => 23/11/2020
[hour] => 16:36
[location] => NOVO HAMBURGO / RS
[action] => Objeto em trânsito - por favor aguarde
[message] => Objeto em trânsito - por favor aguarde de Agência dos Correios em NOVO HAMBURGO / RS para Unidade de Tratamento em PORTO ALEGRE / RS
[change] => há 154 dias
)
[5] => Array
(
[date] => 23/11/2020
[hour] => 09:35
[location] => NOVO HAMBURGO/RS
[action] => Objeto postado
[message] => Objeto postado
[change] => há 154 dias
)
)
)
实际上,我验证了数组的数量,并以此来决定是否存储在mysql中,如果不存在,我就编写存储的代码,如下所示:
$resultados = count($resultado["$objeto"]);
if ($resultados == 1) {
$data_evento_0 = $resultado["$objeto"]['0']['date'];
$hora_evento_0 = $resultado["$objeto"]['0']['hour'];
$pre_localizacao_evento_0 = $resultado["$objeto"]['0']['location'];
$localizacao_evento_0 = substr(strtolower($pre_localizacao_evento_0), 0, strlen($pre_localizacao_evento_0)-3);
$estado_evento_0 = substr(strtoupper($pre_localizacao_evento_0), -2);
$acao_evento_0 = $resultado["$objeto"]['0']['action'];
$mensagem_evento_0 = $resultado["$objeto"]['0']['message'];
$alteracao_dias_evento_0 = filter_var($resultado["$objeto"]['0']['change'], FILTER_SANITIZE_NUMBER_INT);
$sql_verifica_0="SELECT * FROM eventos WHERE objeto='$objeto' AND posicao='0' LIMIT 1";
$resultado_verifica_0 = mysqli_query($conn,$sql_verifica_0) or die("erro ao tentar verificar");
$num_rows_verifica_0 = mysqli_num_rows($resultado_verifica_0);
if ($num_rows_verifica_0 == 0) {
$sql0 = "INSERT INTO eventos
(id, objeto, data, hora, localizacao, estado,
acao, mensagem, alteracao_dias, posicao)
VALUES (NULL, '$objeto', '$data_evento_0', '$hora_evento_0',
'$localizacao_evento_0', '$estado_evento_0',
'$acao_evento_0', '$mensagem_evento_0',
'$alteracao_dias_evento_0', '0')";
$resultado0 = mysqli_query($conn,$sql0) or die("erro ao tentar cadastrar pedido0");
}
重点是..我的代码太大了,而且我很难使用各种子数组,我试图学习whiles和foreachs来帮助我,但是我不理解使用它们的逻辑...
所以我需要计算子数组的个数,并验证个数组的结果是否存在,然后执行将其存储在mysql中的操作
(如果有人能帮我,我会很高兴的,谢谢你的时间;)
正如您提到的foreach对此很有帮助,下面是一个简单的示例:
foreach($resultado as $key => $item) {
// following line could cause bug, look at your #1 and #2 array data, better to use explode or regexp
// $localizacao_evento = substr(strtolower($item['location']), 0, strlen($item['location'])-3);
// use explode as simple and safer replacement
$location = explode('/', $item['location']);
if(count($location != 2) { die('bad location format: '.$item['location']); /* deal with this situaction */ }
$stmt = mysqli_prepare("SELECT * FROM eventos WHERE objeto=? AND posicao='0' LIMIT 1");
$stmt->bind_parram('s', $key); // objecto
if(!$stmt->execute()) die("erro ao tentar verificar");
if ($stmt->num_rows) {
// id removed, put primary key and auto increment column property to DB
$stmt = mysqli_prepare("INSERT INTO eventos
(objeto, data, hora, localizacao, estado,
acao, mensagem, alteracao_dias, posicao)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, '0')");
$stmt->bind_parram('s', $key); // objecto
$stmt->bind_parram('s', $item['date']); // data
$stmt->bind_parram('s', $item['hour']); // hora
$stmt->bind_parram('s', $location[0]); // localizacao
$stmt->bind_parram('s', $location[1]); // estado
$stmt->bind_parram('s', $item['action']); // acao
$stmt->bind_parram('s', $item['message']); // mensagem
$stmt->bind_parram('i', filter_var($item['change'], FILTER_SANITIZE_NUMBER_INT); // alteracao_dias
if(!$stmt->execute()) die("erro ao tentar cadastrar pedido0");
}
}
我强烈建议您使用准备好的语句来防止sql注入,并且对数据库中的列ID使用key和auto increment for ID。