2012-02-06 20 views

Odpowiedz

8

Zobacz: Funkcje PHP is_string() i is_numeric().

W połączeniu z array_filter, można porównać dwie tablice, aby sprawdzić, czy są one równe.

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!'); 
+0

Byłoby wspaniale, gdyby potrzebował danych na każdym polu indywidualnie, ale dość nieefektywnym, gdy potrzebna jest tylko jedna wartość dla całej tablicy, czyż nie? – Vyktor

+0

Moje przeprosiny, przeczytaj błędne pytanie. Zaktualizowałem go do użycia array_filter, ale nadal uważam, że to rozwiązanie będzie iterować przez tablicę dwa razy (ale uważam, że jest nieuniknione) –

+0

Rozumiem logikę twojej funkcji, ale myślę, że wielu programistów zapomniało "starych sposobów" na myślenie w sposób proceduralny i z sekwencyjnym podejściem do rzeczy. Spójrz na moją odpowiedź, szczerze powiedz mi, co ci się nie podoba. – Vyktor

3

Jeśli szukasz zrobić jeden bieg za pośrednictwem tablicy, można napisać własną funkcję aby sprawdzić każdą z wartości zgodnie z określonymi kryteriami. Coś jak:

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

Następnie można filtrować tablicę jak:

if (array_filter($arr, 'is_string_or_numeric') === $arr) 
0

Cóż, tak naprawdę zależy od tego, co masz na myśli przez „albo sznurka lub numerycznych” (może to oznaczać is_numeric(X) lub is_int(X) || is_string(X), lub dowolną liczbę innych rzeczy). Prawdopodobnie najbardziej efektywny sposób (choć jest to bardziej gadatliwy) jest taka:

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

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

    return $valid; 
} 
7

Skuteczniejsze byłoby to:

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

Ta metoda:

  • nie stworzy nową tablicę
  • zatrzyma się po pierwszej niepoprawnej wartości
0

Wiele odpowiedzi na ten. Jeśli chcesz użyć metody, z której korzystasz, zechcesz napisać własną funkcję.

więc dla każdego elementu w tablicy masz zamiar sprawdzić, czy jest to numer:

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

a następnie wywołać tę funkcję testową używając array_filter

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

Czy napisałeś funkcję ' is_string() "? Jeśli nie, array_filter($arr, 'is_string') może nie działać tak jak myślisz.).

+1

Czy nie osiągnąłbyś tego samego z mniejszym kodem, gdybyś po prostu pobiegł, jeśli (array_filter ($ arr, 'is_numeric') zamiast tworzyć nową funkcję –

+0

Wydaje mi się nie na temat –

0

dwa fakty:

  • foreach jest szybszy niż array_map(), ponieważ nie robi wywołać funkcję na każdej iteracji
  • pomocą operatora === jest szybszy niż is_int/is_string, tak jak poniżej:

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

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

Powiązane problemy