PHP проверяет, является ли какое-либо значение массива строковым или числовым? - PullRequest
5 голосов
/ 07 февраля 2012

У меня есть массив значений, и я хотел бы проверить, что все значения являются строковыми или числовыми. Какой самый эффективный способ сделать это?

В настоящее время я просто проверяю строки, поэтому я просто делал if (array_filter($arr, 'is_string') === $arr), который, кажется, работает.

Ответы [ 7 ]

8 голосов
/ 07 февраля 2012

См .: PHP * is_string () и is_numeric () функции.

В сочетании с array_filter вы можете сравнить два массива, чтобы увидеть, равны ли они.

function isStringOrNumeric($in) {
// Return true if $in is either a string or numeric
   return is_string($in) || is_numeric($in);
}

class Test{}

$a = array( 'one', 2, 'three', new Test());
$b = array_filter($a, 'isStringOrNumeric');

if($b === $a)
    echo('Success!');
else
    echo('Fail!');
7 голосов
/ 07 февраля 2012

Более эффективным было бы это:

function isStringNumberArray( $array){
  foreach( $array as $val){
    if( !is_string( $val) && !is_numeric( $val)){
      return false;
    }
  }
  return true;
}

Этот метод:

  • не будет создавать новый массив
  • остановится после первого неверного значения
3 голосов
/ 07 февраля 2012

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

function is_string_or_numeric($var)
{
    return is_string($var) || is_numeric($var);
}

Тогда вы можете отфильтровать ваш массив как:

if (array_filter($arr, 'is_string_or_numeric') === $arr)
2 голосов
/ 07 февраля 2012

Функции PHP ctype, в частности ctype_alpha() и ctype_digit(), также заслуживают внимания:

http://php.net/manual/en/book.ctype.php

0 голосов
/ 22 июня 2015

Два факта:

  • foreach быстрее, чем array_map (), потому что он не вызывает функцию на каждой итерации
  • с использованием оператора === быстрее, чемis_int / is_string, вот так:

    if ((int)$value === $value) echo "its an int";

    if ((string)$value === $value) echo "its a string";

0 голосов
/ 07 февраля 2012

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

, поэтому для каждого элемента в массиве вы собираетесь проверить, является ли это число:

function isNumber($array_element) {
    return is_numeric($array_element);
}

и затем вызовите эту тестовую функцию, используя array_filter

if (array_filter($arr, 'is_number')  {
  // is a number code here.
}

Вы написали функцию 'is_string ()'?Если нет, array_filter($arr, 'is_string') может работать не так, как вы думаете.).

0 голосов
/ 07 февраля 2012

Ну, это на самом деле зависит от того, что вы подразумеваете под «либо строковым, либо числовым» (это может означать is_numeric(X), или is_int(X) || is_string(X), или любое другое число).Вероятно, наиболее эффективный способ (хотя и более многословный) заключается в следующем:

public function isValid(array $array) {
    $valid = TRUE;

    foreach ($arr as $value) {
        if (!is_int($value) && !is_string($value)) {
            $valid = FALSE;
            break;
        }
    }

    return $valid;
}
...