大学で出題された問題を解決するために助けが必要です。それは次のようになります: 「連想配列に含まれる整数の数をチェックする PHP の関数。データは引数を介してではなく、グローバル変数として送信されます」。ありがとう!
2 に答える
これは本当に危険な質問です。まず、PHP は強く型付けされていないため、「これは整数である」という概念が明確ではありません。たとえば、次の配列にはいくつの整数がありますか?
$array = array(5, "6", "7abc", 8.0, "9.0xyz", false);
型を厳密に見ると、整数は 1 つです。大まかに比較すると (つまり、暗黙的な型強制を許可する)、6 つあります。任意の関数を使用して、特定の状況で何かが整数に似ているかどうかを判断できます。質問だけでは 1 つの答えを出すのに十分な情報がないと思いますが、講義ではより多くのコンテキストが提供されたと思います。
また、質問には別の問題があります。「連想配列に整数がいくつあるか」には、「in」の明確な定義がないというか、配列の真の構造の定義がありません。以下を検討してください。
class Foo {
public $x;
public $y;
private $xy;
public __construct($x, $y) { $this->x = $x; $this->y = $y; $this->xy = $x * $y; }
}
$array = array(
10,
new Foo(3, 4),
array(
array(
12,
),
17,
3
)
);
トップレベルのみを考慮しますか、それとも再帰的に下降しますか? 再帰的に下降する場合、オブジェクトの内部もスキャンする必要がありますか? これらのオブジェクトのプライベート整数も配列に含まれていますか? また、再帰的に下降するアルゴリズムは、サイクルを検出して回避する必要がありますか? 実際に何が求められているかについては、かなりの不確実性があります。
したがって、質問に答えるには、いくつかの仮定を立てる必要があります。変数の型を決定するために、「is_int」関数または同等の関数を使用して整数をチェックすることを意図していると推測しています。第二に、連想配列のトップレベルのみに関係することを意図していると思います。この演習は、「foreach」に精通していること、グローバル変数にアクセスする方法、および PHP でそれらを無視できる場合でも、変数にはまだ型があるという現実を証明することだったと思います。
「データは引数を介して送信されるのではなく、グローバル変数として送信されます」と少し混乱するかもしれませんが、それは単に関数が引数を取らないことを意味します。代わりに、グローバル配列内の整数をカウントします。この例では、グローバル配列を「$globalArray」と呼びます。
$globalArray = array("k1" => "foo", "k2" => 5, "k3" => "bar", "k4" => 10);
function num_ints_in_array() {
global $globalArray;
$num_ints = 0;
foreach ($globalArray as $v) {
if (is_int($v)) ++$num_ints;
}
return $num_ints;
}
楽しみのための追加編集: もちろん、多くのアプローチがあります。この特定の機能的なソリューションは、私の空想をくすぐります。
function num_ints_in_array() {
global $globalArray;
return count(array_filter($globalArray, 'is_int'));
}
次のことを試してください。
<?php
$a[0] = 1;
$a[1] = 'aam';
$a[2] = 5;
$a[3] = 'c';
$result = count($a);
$totalints = 0;
for ($i = 0; $i < $result; $i++)
{
if (is_int($a[$i]))
{
$totalints++;
}
}
echo "Total number of integers: " . $totalints;
?>