php array: возвращает совпадающие элементы

#php #arrays

#php #массивы

Вопрос:

  class Photos 
{
private $photos = array();

function add_photo($filename, $date, $lat, $long) 
{
  $this->photos[] = array('filename' => $filename, 'date' => $date, 'lat' => $lat,  'long' => $long);
    return $this;
}

function get_all() 
{
   return json_encode($this->photos);
}

function get_N($n) 
{
    return json_encode(array_slice($this->photos, 0, $n));
}

}
  

Я хотел бы использовать другую функцию в моем классе, которая возвращает некоторые массивы с определенной датой. Дата извлекается из фотографий с помощью функции exif_read_data. Они выглядят примерно так: 2011:04:01 16:12:23 . Функция, которую я ищу, должна возвращать все фотографии с определенной даты. Итак, я хотел бы знать, как заставить функцию возвращать, например, все фотографии с меткой даты, выглядящие как 2011:04:01 xx:xx:xx . Надеюсь, вы понимаете, что я имею в виду. Заранее спасибо!

Ответ №1:

Это должно сделать это:

 class Photos 
{
    private $photos = array();

    function add_photo($filename, $date, $lat, $long) { /* ... */ }

    function get_all() { /* ... */ }

    function get_N($n) { /* ... */ }

    function get_by_date($date)
    {
        $result = array();

        foreach ($this->photos as $photo)
        {
            if (strpos($photo['date'], $date) === 0)
            {
                $result[] = $photo;
            }
        }

        return $result;
    }
}

Photos::get_by_date('2011:04:01');
  

Возможно, вы также захотите взглянуть на array_filter() функцию.


 function get_all_dates()
{
    $result = array();

    foreach ($this->photos as $photo)
    {
        $result[substr($photo['date'], 0, 10)] = null;
    }

    return array_keys($result);
}
  

 function get_all_dates_with_count()
{
    $result = array();

    foreach ($this->photos as $photo)
    {
        $date = substr($photo['date'], 0, 10);

        if (empty($result[$date]))
        {
            $result[$date] = 0;
        }

          $result[$date];
    }

    return $result;
}
  

Комментарии:

1. Хорошее замечание о функции array_filter(), но фактически это было бы то же самое, что просто делать то, что у вас есть здесь. В конечном итоге вы все равно напишете функцию, сравнивающую дату.

2. @Compeek: В PHP 5.3 вы можете определять лямбда-функции, но да. Я только что упомянул, потому что OP может захотеть выполнить аналогичные фильтры для своих данных. 🙂

3. Никогда не помешает дать ответ с информацией о бонусе. 🙂

4. хм, следующий вопрос: есть ли какой-нибудь способ создать функцию, которая возвращает все даты, содержащие какие-либо фотографии?

5. кстати, как мне подсчитать количество фотографий для каждой даты? я хотел бы возвращать количество с каждой датой.

Ответ №2:

 function get_by_date($date) {
    $date = strftime('%D', strtotime($date));
    $photos = array();
    foreach($this->photos as $photo) {
        if(strftime('%D', strtotime($photo['date'])) == $date) {
            $photos[] = $photo;
        }
    }
    return $photos;
}
  

Ответ №3:

Я бы просто проверил, совпадают ли первые 10 символов:

 public function getByDate($date) {
    $return = array();
    foreach ($this->photos as $photo) {
        if ($date == substr($photo['date'], 0, 10)) {
            $return[] = $photo;
        }
    }

    return $return;
}
  

Если вы используете PHP 5.3, вы могли бы сделать это с помощью array_filter и замыкания:

 public function getByDate($date) {
    return array_filter($this->photos, function($photo) use($date) {
        return $date == substr($photo['date'], 0, 10);
    });
}