PHP: условно добавить элементы массива - PullRequest
3 голосов
/ 04 января 2010
$headers=array(
     $requestMethod." /rest/obj HTTP/1.1",
     "listable-meta: ".$listablemeta,
     "meta: ".$nonlistmeta,
     'accept: */*',
      );

В приведенном выше примере я хотел бы опустить всю строку, если $ listablemeta или $ nonlistmeta не заполнены. Предположим, что $ listablemeta пусто. Тогда массив будет:

$headers=array(
     $requestMethod." /rest/obj HTTP/1.1",
     "meta: ".$nonlistmeta,
     'accept: */*',
      );

Теперь я могу установить условную функцию isempty () и соответственно установить массив, но что, если я хочу создать массив с, скажем, 20 различными значениями, каждое из которых устанавливается только, если переменная в каждой строке не пуста, есть ли другой способ установить условие -в объявлении массива? Если нет, то как еще можно решить эту проблему?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 04 января 2010

Переберите массив параметров, и, если значение не пустое, добавьте его в массив заголовков:

$headers = array(
  $requestMethod." /rest/obj HTTP/1.1",
  "meta: ".$nonlistmeta,
  'accept: */*'
);

$items = array(
  "item1" => "",
  "item2" => "foo"
);

foreach ($items as $key => $val) {
  if ($val != "") {
    $headers[] = $val; // only 'foo' will be passed
  }
}
1 голос
/ 04 января 2010

Вы не можете делать какие-либо условия внутри предложения массива, которые бы помогли вам в этом, но это должно соответствовать вашим потребностям:

Если заголовки, которые вы хотите передать в массив, следующие:

$requestMethod = 'GET';
$listablemeta = ''; // This shouldn't be in the final result
$nonlistmeta = 'non-listable-meta';

Создать массив ключ / значение из этих переменных:

$headers = array(
               0 => $requestMethod." /rest/obj HTTP/1.1",
               'listable-meta' => $listablemeta,
               'meta' => $nonlistmeta,
               'accept', '*/*'
           );

Обратите внимание, что если значение не имеет ключа, как в requestMethod, просто поместите туда числовое значение. Затем переберите их и создайте окончательный массив:

function buildHeaders($headers) {
    $new = array();

    foreach($headers as $key => $value) {
        // If value is empty, skip it
        if(empty($value)) continue;
        // If the key is numerical, don't print it
        $new[] = (is_numeric($key) ? '' : $key.': ').$value;
    }

    return $new;
}

$headers = buildHeaders($headers);

$headers теперь должен содержать что-то вроде этого:

$headers = array(
               'GET /rest/obj HTTP/1.1',
               'meta: non-listable-meta-here',
               'accept: */*'
           );
1 голос
/ 04 января 2010

Я не знаю, как это сделать в объявлении, но простая вспомогательная функция, вероятно, справилась бы с задачей:

function array_not_empty($values){
  $array = array();
  foreach($values as $key=>$value){
    if(!empty($value)) $array[$key] = $value;
  }
  return $array;
}
...