Рубрика | Функции из жизни RSS-лента этой рубрики

Аналог PHP функции in_array для многомерного массива

Привет! Хочу поделиться очень полезной функцией, которую нашел недавно в сети. Данная функция рекурсивно проверяет наличие значения в многомерном массиве, аналогично функции in_array для одномерных массивов.

То есть, допустим у вас есть массив:

$array = array( array( 'a', 'b' ), array( 'c', 'd', 'e' ), 'f', 'g' );

И вы хотите проверить, содержит ли данный массив $array значение "d". В таком случае вам как раз поможет эта простая функция, код которой приведен ниже. Стандартная функция in_array в таком случае вам не поможет.

Код функции:

function in_multiarray( $e, $a )
{
 $t = sizeof( $a ) - 1;
 $b = 0;
 while($b <= $t)
 {
  if( isset( $a[ $b ] ) )
  {
   if( $a[ $b ] == $e )
    return true;
   else
   if( is_array( $a[ $b ] ) )
    if( in_multiarray( $e, ( $a[ $b ] ) ) )
     return true;
  }

  $b++;
 }

 return false;
}

Применение:

$array = array( array( 'a', 'b' ), array( 'c', 'd', 'e' ), 'f', 'g' );

if( in_multiarray( 'd', $array ) )
 echo 'элемент "d" есть в массиве';

Заметка: Данная функция не работает с ассоциативными массивами в некоторых случаях. Для такого типа массивов данную функцию нужно дополнить таким образом, чтобы ассоциативные индексы переводились в порядковые.

Успехов!

P.S. Если у вас есть тоже в запасе какие-то полезные функции, которые сильно облегчают жизнь, то если хотите, выкладывайте их в комментах ниже.

Как перевести секунды UNIXTIME в месяцы, дни, часы, минуты PHP

За время, что я занимаюсь разработкой на WordPress, у меня накопилось множество полезных "сниппетов" (отрывков из кода, которые помогают решать какие-то задачи). И поэтому, сегодня хочу поделиться отрывочком, который помог и до сих пор помогает мне во многих случаях, когда нужно работать со временем и так или иначе преобразовывать unix time в дни, часы, минуты и секунды.

И хотя моя жизнь стала легче с введением новых возможностей PHP5.3. Например, в нашем арсенале с версии 5.2 появился класс для работы с датами DateTime, а в версии 5.3 - исчезает необходимость в изобретении собственных решений по сложению и вычитанию дат. Это несомненно удобно.

Но вот, чтобы перевести метку unix timestamp в дни, часы, минуты и секунды начинающим разработчикам по-прежнему нужно искать какое-то решение или удобную функцию. Я пару лет назад поленился создавать что-то свое и после тщательных поисков нашел подходящее математическое решение 🙂

Итак, представляю вам отрывок из кода:

// $res = это ваша переменная со значением времени в формате UNIX

// получаем кол-во всех месяцев
// деля все секунды на значение 1 месяца в секундах
$month = floor( $res / 2592000 );

// получаем кол-во всех дней, но затем
// оставляем только дни последнего неполного месяца
// с помощью получения остатка от деления всего кол-ва
// дней на 30
$day = ( $res / 86400 ) % 30;

// получаем кол-во всех часов, затем
// оставляем только часы из последних неполных суток
$hour = ( $res / 3600 ) % 24;

// получаем кол-во всех минут, затем
// оставляем только минуты из последнего неполного часа
$min = ( $res / 60 ) % 60;

// получаем кол-во секунд из последней неполной минуты
$sec = $res % 60;

// используем переменные $month, $day, $hour, $min, $sec

Теория:

Символ % в PHP, как и в некоторых других языках программирования, представляет собой остаток от деления. Если точнее, то это значение получаемое при вычитании целого частного из исходного значения. То есть, 10 / 3 = 9 (значение integer), в то время как 10 % 3 = 1 (это и есть остаток от деления 10 на 3).

Я объясняю этот момент подробно, потому что сам тормозил, когда впервые увидел этот код и попытался понять его смысл.

Поскольку значение $month (месяца) выбрано максимально возможным значением, то от него уже не берется остаток при делении, например, на 365. Это было бы необходимо, если бы мы хотели получать еще и количество лет из временных меток.

Тот же самый код, но оформленный в виде функции:

/*
* Функция, получающая из метки времени в формате UNIX TIME
* месяцы, дни, часы, минуты и секунды
*
* $t - значение UNIX timestamp, которое нужно перевести
* в месяцы, дни, часы, минуты и секунды
*/

function parse_timestamp( $t = 0 )
{
 $month = floor( $t / 2592000 );
 $day = ( $t / 86400 ) % 30;
 $hour = ( $t / 3600 ) % 24;
 $min = ( $t / 60 ) % 60;
 $sec = $t % 60;

 return array( 'month' => $month, 'day' => $day, 'hour' => $hour, 'min' => $min, 'sec' => $sec );
}

Если у вас есть какие-то замечания или предложения по тому материалу, который я описал выше, то пожалуйста, обязательно напишите об этом в комментариях ниже.

Успехов вам в программировании на чудесном языке PHP!