2010-12-03 2 views
0

Ok, я хочу сделать что-то вроде этого:PHP Переменные для если заявления

$which = !empty($param_id) ? "['groups'][$param_id]" : "['groups']"; 

И чем я хотел бы, чтобы быть в состоянии сделать что-то вроде так ...

$all_groups . $which = array(
    -1 => array(
    'id' => '-1', 
    'name' => $txt['parent_guests_only'], 
    'checked' => in_array('-1', $checked) || in_array('-3', $checked), 
    'is_post_group' => false, 
) 

И мне это нужно, чтобы создать массив, как это так, если !empty($param_id)

$all_groups['groups'][$param_id] = array(the array info); 

Но если $ param_id пустой, он должен сделать это вместо:

$all_groups['groups'] = array(the array info); 

Я не думаю, что смогу это конкатенировать или я могу?

Может кто-нибудь, пожалуйста, помогите мне здесь? Это происходит много раз во всей функции, поэтому я не хочу использовать if ... else ... заявления каждый раз. Было бы слишком много, думая о 1 быстром подходе для всех из них.

Спасибо :)

EDIT, здесь есть функция вопрос:

function ListGroups($checked = array(), $unallowed = array(), $order = array(), $param_id = 0) 
{ 
    global $context, $smcFunc, $txt; 

    // We'll need this for loading up the names of each group. 
    if (!loadLanguage('ManageBoards')) 
     loadLanguage('ManageBoards'); 

    if (empty($checked)) 
     return array(); 

    $all_groups['groups'][$param_id] = array(); 

    if (!in_array('-1', $unallowed)) 
     // Guests 
     $all_groups['groups'][$param_id] = array(
      -1 => array(
       'id' => '-1', 
       'name' => $txt['parent_guests_only'], 
       'checked' => in_array('-1', $checked) || in_array('-3', $checked), 
       'is_post_group' => false, 
      ) 
     ); 

    if (!in_array('0', $unallowed)) 
    { 
     // Regular Members 
     if (!empty($all_groups['groups'])) 
      $all_groups['groups'][$param_id] += array(
       0 => array(
        'id' => '0', 
        'name' => $txt['parent_members_only'], 
        'checked' => in_array('0', $checked) || in_array('-3', $checked), 
        'is_post_group' => false, 
       ) 
      ); 
     else 
      $all_groups['groups'][$param_id] = array(
       0 => array(
        'id' => '0', 
        'name' => $txt['parent_members_only'], 
        'checked' => in_array('0', $checked) || in_array('-3', $checked), 
        'is_post_group' => false, 
       ) 
      ); 
    } 

    // Load membergroups. 
    $request = $smcFunc['db_query']('', ' 
     SELECT group_name, id_group, min_posts 
     FROM {db_prefix}membergroups 
     WHERE id_group > {int:is_zero}', 
     array(
      'is_zero' => 0, 
     ) 
    ); 
    while ($row = $smcFunc['db_fetch_assoc']($request)) 
    { 
     if (!in_array($row['id_group'], $unallowed)) 
     { 
      $all_groups['groups'][(int) $param_id][(int) $row['id_group']] = array(
       'id' => $row['id_group'], 
       'name' => trim($row['group_name']), 
       'checked' => in_array($row['id_group'], $checked) || in_array('-3', $checked), 
       'is_post_group' => $row['min_posts'] != -1, 
      ); 
     } 
    } 
    $smcFunc['db_free_result']($request); 

    // Let's sort these arrays accordingly! 
    if (!empty($order)) 
    { 
     $all_groups['groups'][$param_id] = sortGroups($all_groups['groups'][$param_id], $order); 
     $context['group_order' . $param_id] = implode(', ', $order); 
    } 
    else 
    { 
     $context['group_order' . $param_id] = ''; 
     sort($all_groups['groups'][$param_id]); 
     $x = 0; 
     foreach ($all_groups['groups'][$param_id] as $key => $value) 
     { 
      $x++; 
      $context['group_order' . $param_id] .= $x < count($all_groups['groups'][$param_id]) ? $value['id'] . ', ' : $value['id']; 
     } 
    } 

    return $all_groups['groups'][$param_id]; 
} 

мне нужно сделать чек на пустой ($ param_id), если это так, то нужно построить $ all_groups ['groups'] без $ param_id.

Так что нужно добавить в чек для if (!empty($params_id)) построить массив следующим образом: $all_groups['groups'][$params_id] иначе построить его вот так: $all_groups['groups']. Мне не нужна куча if ... else ... заявлений здесь, только 1 или 5 лайнеров будет БОЛЬШОЙ!

Благодарности Ребята :)

+0

О, мои глаза! `global`, **` global` ** !! ; -P – deceze 2010-12-03 01:55:20

+0

`if (!loadLanguage ('ManageBoards')) loadLanguage ('ManageBoards'); `- Если он не работает в первый раз, он будет работать второй раз ...? – deceze 2010-12-03 01:57:56

+0

Есть ли причина, по которой вы назовете переменную `$ all_groups ['groups']`, если вы вообще не ссылаетесь на `$ all_groups`? – deceze 2010-12-03 02:04:02

ответ

3

Не усложнять его. :)

$array = array(
    /* contents */ 
); 

if (!empty($param_id)) { 
    $all_groups['groups'][$param_id] = $array; 
} else { 
    $all_groups['groups'] = $array; 
} 

Я не знаю, что $all_groups['groups'] выглядит как до этого; если бы он был пустым, я бы укоротил его до:

$all_groups['groups'] = array(
    /* contents */ 
); 

if (!empty($param_id)) { 
    $all_groups['groups'] = array($param_id => $all_groups['groups']); 
} 
0
if (!empty($param_id)) { 
    $which = &$all_groups['groups'][$param_id] 
} else { 
    $which = &$all_groups['groups']; 
} 
$which = array(
    -1 => array(
    'id' => '-1', 
    'name' => $txt['parent_guests_only'], 
    'checked' => in_array('-1', $checked) || in_array('-3', $checked), 
    'is_post_group' => false, 
); 

unset($which); // unset $which, if you want to use this variable 
       // in this scope once again 
0

Вообще говоря, ссылки являются решением. См. Ответ @zerkms.

Однако, если это вообще возможно, я попытаюсь перепроектировать структуры данных таким образом, чтобы вам не приходилось прибегать к этому типу условного поведения. Например, при использовании в качестве default отсутствующего ключа по умолчанию:

$which = !empty($param_id) ? $param_id : 'default'; 
$all_groups['groups'][$which] = array(...); 

Я не знаю, если это возможно в вашем случае, но это может быть легче управлять.

Другие возможные решения:

$tmp = array(...); 
if ($cond) 
    $foo = $tmp; 
else 
    $bar = $tmp; 

или:

function make_array(...) 
{ 
    return array(...); 
} 

if ($cond) 
    $foo = make_array(...); 
else 
    $bar = make_array(...); 
Смежные вопросы