Как получить доступ к определенному ключу из ассоциативного массива в smarty?

У меня есть ассоциативный массив, который назначен умному шаблону. Там я не понимаю, как получить доступ к одному конкретному ключу. Я исследовал об этом, но не мог получить конкретное решение. Сценарий следующий:

Мой массив php с именем $all_class_subjects выглядит следующим образом:

Array
(
    [0] => Array
        (
            [class_id] => 1
            [class_name] => I
            [I] => Array
                (
                    [cs_map_id] => 
                    [cs_class_id] => 
                    [cs_subject_id] => 
                    [subjects] => 
                )

        )

    [1] => Array
        (
            [class_id] => 2
            [class_name] => II
            [II] => Array
                (
                    [cs_map_id] => 
                    [cs_class_id] => 
                    [cs_subject_id] => 
                    [subjects] => 
                )

        )

    [2] => Array
        (
            [class_id] => 3
            [class_name] => III
            [III] => Array
                (
                    [cs_map_id] => 
                    [cs_class_id] => 
                    [cs_subject_id] => 
                    [subjects] => 
                )

        )

    [3] => Array
        (
            [class_id] => 4
            [class_name] => IV
            [IV] => Array
                (
                    [cs_map_id] => 
                    [cs_class_id] => 
                    [cs_subject_id] => 
                    [subjects] => 
                )

        )

    [4] => Array
        (
            [class_id] => 5
            [class_name] => V
            [V] => Array
                (
                    [cs_map_id] => 1
                    [cs_class_id] => 5
                    [cs_subject_id] => 3
                    [subjects] => Array
                        (
                            [subject_name] => Mathematics
                        )

                )

        )

    [5] => Array
        (
            [class_id] => 6
            [class_name] => VI
            [VI] => Array
                (
                    [cs_map_id] => 2
                    [cs_class_id] => 6
                    [cs_subject_id] => 4
                    [subjects] => Array
                        (
                            [subject_name] => Biology
                        )

                )

        )

)

Теперь я хочу распечатать значения из этого массива в умном шаблоне. Фрагмент кода приведен ниже. Он может содержать несколько ошибок HTML:

{if $all_class_subjects}
         {foreach from=$all_class_subjects item=class_subject_data}
       <tr>
           <td width="20%">{$class_subject_data.class_name|capitalize}</td>
           <td width="40%">
            {foreach from=class_subject_data item=subject}

            {if $subject.cls_sub_subject_name} 
             {$class_subject_data.cs_subject_id}

Мой вопрос: я хочу проверить, является ли массив

[I] => Array
            (
                [cs_map_id] => 
                [cs_class_id] => 
                [cs_subject_id] => 
                [subjects] => 
            )

пусто или нет. Вы можете видеть, кроме двух последних элементов, что все элементы массива имеют эти поля пустыми. Короче говоря, мой вопрос заключается в том, как получить доступ к внутреннему массиву, содержащему вышеуказанные поля, поскольку индекс массива, т.е. ключ (I, II, III, IV и т. д.), меняется? Функция PHP, которая возвращает массив, выглядит следующим образом:

function GetAllClassSubjects( $cur_page, $sort_col_id, $desc_or_asc, $request) { 
        global $grid;

      $grid->mSqlArr['fields']  = " classes.class_id, classes.class_name" ;
          $grid->mSqlArr['tables']  =   TBL_CLASSES." AS classes ";
          $grid->mSqlArr['orderby'] = "classes.class_order";

          $grid->mSqlArr['where'] = "";

          $grid->mCurPage    = $cur_page;
          $grid->mRecPerPage = REC_PER_PAGE; //default is 20
          $grid->mSortColumns->mColsArr = array('class_id');
          $grid->mSortColumns->mDefaultOrderStr = "";
          $grid->mSortColumns->mCurColNo        = $sort_col_id;
          $grid->mSortColumns->mCurSortOrder    = "DESC";
          $class_data = $grid->GetData();

          //print_p($class_data);
      $grid->mSqlArr['fields']  = " class_subject_mapping.cs_map_id, class_subject_mapping.cs_class_id, class_subject_mapping.cs_subject_id" ;
          $grid->mSqlArr['tables']  =   TBL_CLASS_SUBJECT_MAPPING." AS class_subject_mapping ";
          $grid->mSqlArr['orderby'] = "";

          $grid->mSqlArr['where'] = "";

            $grid->mCurPage    = $cur_page;
            $grid->mRecPerPage = REC_PER_PAGE; //default is 20
            $grid->mSortColumns->mColsArr = array('cs_map_id');
            $grid->mSortColumns->mDefaultOrderStr = "";
            $grid->mSortColumns->mCurColNo        = $sort_col_id;
            $grid->mSortColumns->mCurSortOrder    = "DESC";
            $mapping_data = $grid->GetData();
            //print_p($mapping_data);   

      foreach($class_data as $class)
      {
        $flag = 0;
        $class_id = $class['class_id'];
        $class_name = $class['class_name'];

            foreach($mapping_data as $class_subject)
            {
                $cs_map_id = $class_subject['cs_map_id'];
                $cs_class_id = $class_subject['cs_class_id'];
                $cs_subject_id = $class_subject['cs_subject_id'];


                    if($class_id == $cs_class_id)
                    {
                            $flag = 1;
                            $class_data[$class_id-1][$class_name]['cs_map_id'] = $cs_map_id;
                            $class_data[$class_id-1][$class_name]['cs_class_id'] = $cs_class_id;
                            $class_data[$class_id-1][$class_name]['cs_subject_id'] = $cs_subject_id;

                            $sql  = " SELECT subject_name";
                                    $sql .= " FROM ".TBL_SUBJECTS." AS subjects";
                                    $sql .= " WHERE subjects.subject_id = ".$cs_subject_id;
                                    $sql .= " order by subject_order";

                                    $this->mDb->Query( $sql);
                                    $class_subjects_data = $this->mDb->FetchArray();
                                    //print_p($class_subjects_data);

                                    foreach($class_subjects_data as $sub)
                                    {
                                        $class_data[$class_id-1][$class_name]['subjects'] = $sub;
                                    }
                            }                           
                    }
                    if($flag == 0)
                    {
                        $class_data[$class_id-1][$class_name]['cs_map_id'] = "";
                $class_data[$class_id-1][$class_name]['cs_class_id'] = "";
                $class_data[$class_id-1][$class_name]['cs_subject_id'] = "";
                $class_data[$class_id-1][$class_name]['subjects'] = "";

                    }   
      }
      print_p($class_data);

        //ksort($cls_sub_data[$cs_map_id]); 

    //print_p($cls_sub_data);
    list( $sort_url_param, $sort_col_array, $pagination_array ) =
        $grid->GetUrlParam( PAGE_OFFSET, PHP_SELF."?op=".$query_string."&", "col", 'order', 'page' );

        return array($class_data, $sort_url_param, $sort_col_array, $pagination_array );
}   

Пожалуйста, помогите мне решить эту проблему. Заранее спасибо.


person PHPLover    schedule 15.04.2013    source источник
comment
Почему вы меняете key массива, который вам нужно проверить, вместо того, чтобы сохранять его статичным и использовать class_name для всего, для чего вам может понадобиться римская цифра в smarty?   -  person Jon    schedule 15.04.2013
comment
@Jon Ваше предложение хорошее, но не может быть реализовано в этом сценарии. Я добавил код функции в вопрос, который возвращает массив.   -  person PHPLover    schedule 15.04.2013
comment
Можете ли вы опубликовать полную {if}{/if} структуру вашего смарт-кода?   -  person Ejaz    schedule 15.04.2013


Ответы (1)


Внутри вашего внешнего {foreach}, {$class_subject_data[$class_subject_data.class_name]} даст вам желаемое

Array(
    [cs_map_id] => 
    [cs_class_id] => 
    [cs_subject_id] => 
    [subjects] => 
)

для текущего item=class_subject_data

Попробуйте этот код, он должен напечатать все нужные вам массивы.

{if $all_class_subjects}
    {foreach from=$all_class_subjects item=class_subject_data}
        <tr>
            <td width="20%">{$class_subject_data.class_name|capitalize}</td>
            <td width="40%">
                {assign var='desired_array' value=$class_subject_data[$class_subject_data.class_name]}

                <pre>{$desired_array|@print_r:1}</pre>
            </td>
        </tr>
    {/foreach}
 {/if}

Обновлять

Предполагая, что приведенный выше код печатает для вас желаемый массив, {$desired_array}

array(
    [cs_map_id] => 
    [cs_class_id] => 
    [cs_subject_id] => 
    [subjects] =>
)

Таким образом, он содержит ключи, например, {desired_array.cs_map_id}, {desired_array.cs_class_id} и т. д.

person Ejaz    schedule 15.04.2013
comment
Можете ли вы указать конкретные имена переменных, которые будут печатать все значения. Потому что я не мог получить ясного представления о том, как этого добиться. Пожалуйста, не рассматривайте фрагмент кода, который я использовал в вопросе для печати массива. - person PHPLover; 15.04.2013
comment
предполагая, что он напечатал для вас желаемый_массив, $desired_array равно Array( 'cs_map_id' => '', 'cs_class_id' => '', 'cs_subject_id' => '', 'subjects' => '',). Таким образом, у него есть такие ключи, как {$desired_array.cs_map_id}, {$desired_array.cs_class_id} и т. д. - person Ejaz; 15.04.2013