Использование If-else в массиве

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

<?php
$arrLayout = array(
    "section1" => array(

        "wLibrary" => array(
            "title" => "XBMC Library",
            "display" => ""
        ),

        "wControl" => array(
            "title" => "Control",
            "display" => ""
        )
        )
            )
?>

что я хочу, это

<?php

$LibraryStatus='true'

$arrLayout = array(
    "section1" => array(

                  if $LibraryStatus='true' (

        "wLibrary" => array(
            "title" => "XBMC Library",
            "display" => ""
        ),
                  else blank.      

              if $ControlStatus='true' (

    "wControl" => array(
            "title" => "Control",
            "display" => ""
        )
    )
            )
?>

если его false, то он также будет пустым, очевидно. Возможно ли иметь if внутри массива, управляющего другим массивом? Если да, то как это будет работать? Это только часть массива, есть больше опций и разделов I просто взял их для простоты как раз я понимаю, как раз масштаб.

спасибо

10 ответов


Да, это возможно используя определенные сокращенное:

<?php

$LibraryStatus = $ControlStatus = true;

$arrLayout = array(
             "section1" => array(
             ($LibraryStatus ? array("wLibrary" => array("title"   => "XMBC Library",
                                                         "display" => "")) : false),
             ($ControlStatus ? array("wControl" => array("title"   => "Control",
                                                         "display" => "")) : false)));

print_r($arrLayout);

?>

он работает следующим образом:

if($a == $b){ echo 'a'; }else{ echo 'b'; }

равна

echo $a == $b ? 'a' : 'b';

Если вы используете эту стенографию, она всегда будет возвращать вывод, поэтому вы можете поместить ее между скобками и поместить между массивом.

http://codepad.org/cxp0M0oL

но для этой ситуации есть и другие решения.


внутри массива вы можете использовать тернарный оператор:

$a = array(
    'b' => $expression == true ? 'myWord' : '';
);

но в вашем примере лучший способ-переместить if-оператор вне вашего массива.


вы усложняете вещи напрасно.

Если условие и значения, которые вы хотите назначить достаточно просты, вы можете использовать тернарный оператор (?:) вот так:

$condition = true;
$arrLayout = array(
    "section1" => $condition ?
                     array(
                         "wLibrary" => array(
                             "title" => "XBMC Library",
                             "display" => ""
                         )
                     ) : false,
)

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

$condition = true;
$arrLayout = array(
    "section1" => false
);

if($condition) {
    $arrLayout["section1"] = array(
                                  "wLibrary" => array(
                                     "title" => "XBMC Library",
                                     "display" => ""
                                  )
                             );
}

то, что вы предлагаете, невозможно. Вам нужно будет добавить базу переменных в условие if/else после того, как вы сделали массив.

например:

$arrLayout = array();

if($LibraryStatus) {
    $arrLayout['section1'] = array("wLibrary" => array(
            "title" => "XBMC Library",
            "display" => ""
        ));
}

Это все еще довольно неопрятно из-за вашей структуры массива, я бы попытался исключить некоторые ключи, если вы можете, например, вам нужно section1? Вы можете просто позволить PHP добавить числовой ключ, выполнив $arrLayout[] = array(..), которые создают новую строку в массив, который можно еще перебрать.


нет, у вас не может быть if-else блок в середине объявления массива. Однако вы можете манипулировать массивом по-разному для достижения желаемого результата. См.функции для работы с массивами.


вы можете сделать:

$emptyArray = array();
$arrLayout = array("section1" => $emptyArray);

$LibraryStatus= true ;
if ($LibraryStatus=== true) {
     $arrLayout["section1"]["wlibrary"] =  array("title" => "XBMC Library","display" => "" );
}

вы можете использовать push?

<?php

$LibraryStatus='true'

$arrLayout = array();
if ($LibraryStatus=='true') {
push($arrLayout["section1"], array(
        "wLibrary" => array(
            "title" => "XBMC Library",
            "display" => ""
        ));
}
?>

в некотором смысле, да.

вы не можете разместить его там, где вы спросили (сразу после открытия массива) Вы не можете использовать оператор if. Вы можете использовать троичный (условие)? true: false

<?php

$LibraryStatus = 'true';

$array = array(
    "section1" => ($LibraryStatus == 'true') ? array("wLibrary" => array("title" =>     "Title","display" => "")) : array()  
);

?>

другой способ-включить логику либо в функцию, либо через файл включения.

функции:

function section1Function($status = false){
    if ($status){
        return array(
            "wLibrary" => array(
                "title" => "XBMC Library",
                "display" => ""
            )
        );
    } else {
        return array(
            "wControl" => array(
                "title" => "Control",
                "display" => ""
            )
        );
    }
}

$LibraryStatus='true'

$arrLayout = array(
    "section1" => section1Function($LibraryStatus),
)

?>

С включить файл:

<?php


$LibraryStatus='true'

$arrLayout = array(
    "section1" => require( dirname(__FILE__) .'/section1Layout.php'),
)

?>

section1Layout.на PHP:

<?php
if ($LibraryStatus){
    return array(
        "wLibrary" => array(
            "title" => "XBMC Library",
            "display" => ""
        )
    );
} else {
    return array(
        "wControl" => array(
            "title" => "Control",
            "display" => ""
        )
    );
}
?>

столкнулся с этой проблемой, когда настраивал PDO debug режим, который зависит от настройки конфигурации.

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

array(
    'key' => $variable ? 'Sets certain value if $variable === true' : 'Sets certain value if $variable === false'
);