0

私は CodeIgniter 2 のプロジェクトに取り組んでいますが、今は最も基本的な概念に固執しています。

モデル:

という名前のフィールドの特定の値に一致するすべての行を含むテーブルからオブジェクト配列を取得しますfoo。一致する行が 1 つ以上存在する場合があります。この例では、2 行です。

public function get_sample($foo)
{
    $query = $this->db->get_where('sample_db', array('foo' => $foo));

    return $query->result();
}

コントローラ:

結果を割り当て、出力を表示できるようにします。

public function view($foo)
{
    $data['array'] = $this->sample_model->get_sample($foo);

    $this->load->view('view', $data);
}

意見:

echo var_dump($array); // for testing

echo $array[1]->text

var_dump()$array:

array(2) {
    [0]=> object(stdClass)#23 (4) {
        ["id"]=> string(1) "1"
        ["foo"]=> string(3) "bar"
        ["number"]=> string(4) "1234"
        ["text"]=> string(23) "This is content in 1234"
    }
    [1]=> object(stdClass)#24 (4) {
        ["id"]=> string(1) "2"
        ["foo"]=> string(3) "bar"
        ["number"]=> string(4) "9999"
        ["text"]=> string(23) "This is content in 9999"
    } 
} 

のレンダリングされた出力echo $array[1]->text;は次のとおりです。This is content in 9999

そして、それがどのように機能しているかを理解してい ます。これは、2 番目のオブジェクトである のインデックスを持つ配列オブジェクトのフィールド$array[1]->textの内容です。text1

ただし、呼び出されたフィールドがあり、特定のオブジェクトにアクセスして、対応する値を取得しnumberたいと考えています。numbertext

例:text where の値を取得するにはどうすればよいnumberです9999か? $array[1]->text配列内のオブジェクトの位置を確認できないため、使用できません。のようなものです$array['number' => '9999']->textが、それが正しくないことはわかっています。たぶん、配列をループして一致を探す必要がありますか?

これは非常に単純に見えますが、私が試したことはすべて失敗し、さまざまな PHP エラーが発生しました。私は PHP のマニュアルをここここで勉強していますが、自分がやろうとしていることについて何も見つけられないようです。任意のガイダンスをいただければ幸いです。

MVC モデルに従ったベスト プラクティスを使用した回答に加えて、ドキュメントの適切なページへのリンクと、上記の文言/用語の誤りを指摘することを望んでいます。


編集:

この回答には、問題を解決するために使用した実際のコードが含まれています。しかし、八木の答えは私を正しい方向に導いたので受け入れられました。

4

4 に答える 4

2

これを使用するのはどうですか:

foreach ($array as $row) {
        if ($row->number == '9999') {
            echo $row->text;
        }
    }

配列をループし、数値オブジェクトの値 9999 を見つけてテキストを取得します

于 2012-12-16T02:49:45.157 に答える
0

クエリを実行してその番号を検索してみませんか(またはその番号で並べ替えてみませんか?)

いずれにせよ、必要なのは多次元配列検索関数です(オブジェクトの配列を反復処理し、見つかったフィールド値の組み合わせを返します)。

このようなもの(これをヘルパーに入れてください)

function multi_array_search($array, $field, $value) 
 { 
     $results = array(); 

     if (is_array($array)) 
     { 
         if ($array->$field == $value)  //chek the filed against teh value, you can do addional check s(i.e. if field has been set)

             $results[] = $array; 

         foreach ($array as $subarray) 
             $results = array_merge($results,  multi_array_search($subarray, $key, $value));  //recurisve serach
     } 

     return $results; 
 }


    //than in view or in controller, depending where you need it

   $result  = multi_array_search($array, "number", "9999");

var_dump($result)が返されるか、またはfoudnインスタンスの数かどうか

array() {
    [0]=> object(stdClass)#24 (4) {
        ["id"]=> string(1) "2"
        ["foo"]=> string(3) "bar"
        ["number"]=> string(4) "9999"
        ["text"]=> string(23) "This is content in 9999"
    } 

}

于 2012-12-16T02:35:05.367 に答える
0

八木の答えのおかげで、私は次の非常に簡単な解決策を思いつきました。配列をループして、の値textと一致するインデックスを持つ新しい配列にの値を割り当てますnumber。次に、ビューファイルで、textこのインデックスに基づいて値にアクセスできます。

コントローラ:

public function view($foo)
{
    $data['array'] = $this->sample_model->get_sample($foo);

    foreach ($data['array'] as $row) {
        $data['result'][$row->number] = $row->text;
    };

    $this->load->view('view', $data);
}

意見:

if (isset($result[9999])) echo $result[9999];
于 2012-12-16T21:53:23.687 に答える
0

あなたはこのようなものを探しているかもしれません...

array_filter($array, function($o){ return $o->number == 9999; } );

http://php.net/manual/en/function.array-filter.php

編集

$o は、コールバック関数のパラメーターです。配列の各要素がコールバック関数に渡されます。関数が false を返す場合、要素は除外されます。

$arr = array(
    (object) array(
        'num' => 33,
        'text' => 'hello',
    ),
    (object) array(
        'num' => 44,
        'text' => 'world',
    ),
);
$filtered = array_filter($arr, function($o){ return $o->num == 33; });
echo $filtered[0]->text; // hello

おっしゃる通りindexは残るので、array_valuesかarray_shiftを使ってください。ここに関数の例があります

function get_by_num($arr, $num){
    return array_shift(array_filter($arr, function($o) use ($num) { return $o->num == $num; }));
}
$obj = get_by_num($arr, 44);
var_dump($obj);
// object(stdClass)#2 (2) { ["num"]=> int(44) ["text"]=> string(5) "world" }

この場合、 $obj は、要素が見つからない場合は NULL になるか、最初に一致したものになります。$num は一緒に転送されるため、任意の値を使用できます。あなたもそれを改善することができます:

function get_first_match($arr, $field, $val){
    return array_shift(array_filter($arr, function($o) use ($field, $val) { return $o->{$field} == $val; }));
}
$obj = get_first_match($arr, 'num', 44);

任意のフィールドを検索できるようになりました。あなたの場合

$obj = get_first_match($array, 'number', 9999);
于 2012-12-16T02:25:19.410 に答える