Filtrar array multi dimensional por valor em PHP

4 de Dezembro, 2009

Uma das grandes lacunas em PHP é que não existe uma função nativa para filtrar um array multi dimensional por valor.

Analisemos o seguinte array:

$data = array(
  0 => array('id' => '1', 'name' => 'home', 'value' => 'setPointer', 'obs' => 'page'),
  1 => array('id' => '2', 'name' => 'width', 'value' => 255, 'obs' => 'layout'),
  2 => array('id' => '3', 'name' => 'heigt', 'value' => 324, 'obs' => 'layout'),
  3 => array('id' => '4', 'name' => 'color', 'value' => 'FF0000', 'obs' => 'page'),
  4 => array('id' => '5', 'name' => 'background', 'value' => '00FF00', 'obs' => 'page'),
  5 => array('id' => '6', 'name' => 'size', 'value' => 255, 'obs' => 'page'),
  6 => array('id' => '7', 'name' => 'position', 'value' => 324, 'obs' => 'layout'),
  7 => array('id' => '8', 'name' => 'left', 'value' => 32, 'obs' => 'layout'),
  8 => array('id' => '9', 'name' => 'top', 'value' => 32, 'obs' => 'layout'),
  9 => array('id' => '10', 'name' => 'right', 'value' => 32, 'obs' => 'page')
);

A partir deste array multi dimensional, desejo filtrar todos os elementos com a chave ‘value’ que tenham um valor igual a 32.

Como faço?
Ler o resto desta entrada

Inserir ou actualizar registo em uma petição em MySQL

29 de Novembro, 2009

Por vezes temos a necessidade de inserir um determinado registo e caso este já exista na base de dados queremos actualizá-lo.

Neste caso o mais comum é fazer duas petições à base de dados. Fazemos uma consulta para ver se já existe esse registo e dependendo da resposta da base de dados actualizamos ou inserimos a informação desejada.

<?php

$db = mysqli_init();
if(mysqli_real_connect($db, '127.0.0.1', 'root', '1234', 'demos'))
{
  // Consula para verificar se já existe registo na base de dados //
  $query = "SELECT COUNT(id) AS valor FROM demos WHERE id=2 LIMIT 1;";
  if(mysqli_real_query($db, $query))
  {
    $result = mysqli_store_result($db);
    $data = mysqli_fetch_array($result, MYSQLI_ASSOC);
    mysqli_free_result($result);

    if($data['valor'] > 0)
    {
      // Como existe registo, se actualiza os valores //
      $query = "UPDATE demos SET value='value' WHERE id=2 LIMIT 1;";
      if(mysqli_real_query($db, $query))
      { echo "Actualizado..."; }
      else
      { echo "Erro ao actualizar registo."; }
    }
    else
    {
      // Como não existe registo, se adiciona os valores //
      $query = "INSERT INTO demos (id, name, value, obs) VALUES ('2', 'name', 'value', 'obs');";
      if(mysqli_real_query($db, $query))
      { echo "Adicionado..."; }
      else
      { echo "Erro ao inserir registo."; }
    }
  }
  else { echo 'Erro na petição.'; };
}
else { echo 'Erro na conexão.'; };

// Total: 2 petições á base de dados //
mysqli_close($db);

?>

Gastamos 0.000035s em duas petições.

Mas será mesmo necessário tanto código e fazer realmente duas petições à base de dados?
Não se pode fazer o mesmo de uma forma mais simples?
Ler o resto desta entrada