3

複数の文字列を呼び出して、それらを単一の文字列に連結しようとしています。isset(); を使用せずに、呼び出されているすべての文字列が設定されていることを確認できるようにしたいと考えています。使用されるすべての文字列。

私が理想的に持っていたいもの:

<?php

$name      = "John Smith";
$age       = "106";
$favAnimal = "pig";
$email     = "john@smith.com";
$sport     = "tennis";

$userDescription = "My name is $name, I am $age years old, I like $sport.";

if(allStringsSet($userDescription)){
    echo $userDescription; //Or do something else
}

?>

すべての文字列を呼び出しているわけではないことに気付くでしょう。私のアプリケーションでは、すべての文字列が常に使用されるわけではないからです。また、私のアプリケーションは約 50 の文字列から選択することになり、どこにでも isset();s の山がなくても設定されていることを確認できる必要があります。

$userDescription が宣言される前に isset チェックを行う必要があると思います。不明な文字列セットが設定されているかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

2

カスタムの getter と setter を持つオブジェクトを使用します。

class CustomStrings()
{
    protected $data;

    public function __set($key, $value) {
        $this->data[$key] = $value;
    }

    public function __get($key) {
        if (isset($data[$key])) {
            return $data[$key];
        }
        return false;
    }

    public function getDescription($description) {
        // regex to find the words following : (or any other char)
        // look for the variables, and do whatever handling you want if they're not found
        // return whatever you want 
        // IF you don't want to do a regex, you can do the following
        foreach ($this->data as $key => $value) {
            $description = str_replace(":$key", $value, $description);
        }
        if (strpos(':', $description) !== FALSE) {
            return $description;
        }
        return false; // or whatever error handling you want
    }
}

$strings = new CustomStrings();
$strings->name = 'John';
$strings->age = 16;
$strings->sport = 'Football';

$description = $strings->getDescription("My name is :name, I am :age years old, I like :sport");

適切なキーを使用してすべての変数を CustomStrings オブジェクトに格納し、 を記述する代わりに を記述$nameします:name

isset関数内で一度だけ処理を行いますgetDescription

私は怠け者なので、正規表現を書きませんでした。:を文字列で使用する場合は、使用しないものに置き換えます。

幸運を!

于 2013-06-12T13:28:11.463 に答える
1

すべての変数を定義する必要がある場合、PHP のisset()は複数の値をサポートしているため、これを行うことができます

<?php

$name      = "John Smith";
$age       = "106";
$favAnimal = "pig";
$email     = "john@smith.com";
$sport     = "tennis";  

if(isset($name, $age, $favAnimal, $email, $sport)) {
    $userDescription = "My name is $name, I am $age years old, I like $sport.";

    echo $userDescription; //Or do something else
}

?>
于 2013-06-12T12:48:58.360 に答える
0

issetを使用せずに変数を使用したい場合の1つの可能な解決策:

次のように文字列を定義します。

$userDescription = "My name is [name], I am [age] years old, I like [sport].";

または、この方法で文字列を更新する必要はありません。引用符を から"に変更するだけ'で、変数は解析されません。

次に、文字列からすべての「変数」を取得します ([]上記の例のテキスト内)。これには ( preg_split()などで)正規表現を使用します。

それらを変数の変数として使用し、それらが空でないかどうかをテストします。

例えば:

for ($i = 0; $i < counr($result); $i++) 
{
  if (($result[$i] == 'name') && (${$results[$i]} == "")) echo "Name is empty"
  if (($result[$i] == 'age') && (is_int(${$results[$i]}) == false)) echo "Age is empty"
  ....
}

上記のコードでは PHP が機能していません。多かれ少なかれ疑似コードを示し、それを実行する方法を示しています。

于 2013-06-12T12:49:52.177 に答える
0

それらを配列に入れてループを使用する必要があります。

$data = array();
$data['name']      = "John Smith";
$data['age']       = "106";
$data['favAnimal'] = "pig";
$data['email']     = "john@smith.com";
$data['sport']     = "tennis";

$userDescription = "My name is $name, I am $age years old, I like $sport.";
$required_fields = array('name', 'age', 'favAnimal', 'email', 'sport');

if(checkData($data,$required_fields)) echo 'all fields are ok';
else echo 'not all fields are OK';

function checkData($data, $requiredFields)
{ 
   foreach($requiredFields as $field)
   {
     if((array_key_exists($field, $data) && !empty($data[$field]))  == false) return false;
   }
   return true;
}

機能チェック データは 2 つの引数を取り、どちらも配列です。

  1. $dataチェックするデータです。

  2. $requiredFields設定する必要があり、空であってはならない必須フィールドの配列です

于 2013-06-12T12:47:24.067 に答える
0

文字列を配列に格納してみませんか? その場合、foreach ループを使用できます。この方法では、 isset() を 1 回だけ使用する必要があります。

$strings = new Array('string1', 'string2', 'string3')
foreach($strings as $str)
{
   if(isset($str))
   {
      //do something..
   }
}
于 2013-06-12T12:47:41.873 に答える