2013-04-11 2 views
1

Я искал в Google и консультации с документацией PHP, но не мог понять, как следующий код работает:PHP - Массивы и Foreach

$some='name=Licensing Module;nextduedate=2013-04-10;status=Active|name=Test Addon;nextduedate=2013-04-11;status=Active'; 
function getActiveAddons($somet) { 
    $addons = array(); 
    foreach ($somet as $addon) { 

     if ($addon['status'] == 'Active') { 
      $addons[] = $addon['name']; 
      continue; 
     } 
    } 

    return $addons; 
} 
echo (count(getActiveAddons($some)) ? implode('<br />', getActiveAddons($some)) : 'None'); 

код всегда эха None.

Пожалуйста, помогите мне в этом.

+0

Попробуйте 'var_dump ($ аддон)' - это выглядит так, как вы думаете, что должен? – andrewsi

+5

Что бы вы ожидали? Ваш аргумент - это строка, а не массив: 'foreach' будет пропущен. – str

+0

@str фактически foreach может работать с любым объектом, который реализует интерфейс Traversable. Но ваш вопрос по-прежнему действителен :) – TheMethod

ответ

0

Я не знаю, откуда у вас этот код, но вы инициализировали $some неправильным способом. Ожидается, как массив, как это:

$some = array(
    array(
    'name' => 'Licensing Module', 
    'nextduedate' => '2013-04-10', 
    'status' => 'Active' 
    ), 
    array(
    'name' => 'Test Addon' 
    'nextduedate' => '2013-04-11', 
    'status' => 'Active' 
    ) 
); 

Я думаю статью вы дочитали ожидает вас для разбора исходной строки в этом формате.

Вы можете достичь этого, как это:

$string = 'name=Licensing Module;nextduedate=2013-04-10;status=Active|name=Test Addon;nextduedate=2013-04-11;status=Active'; 

$result = array(); 
foreach(explode('|', $string) as $record) { 
    $item = array(); 
    foreach(explode(';', $record) as $column) { 
     $keyval = explode('=', $column); 
     $item[$keyval[0]] = $keyval[1]; 
    } 
    $result[]= $item; 
} 

// now call your function 
getActiveAddons($result); 
+0

Хорошо, спасибо. Можете ли вы изменить код так, чтобы он работал с $ some input, который определен? Большое спасибо: D – user2271353

+0

Дайте мне минуту. Подготовлю – hek2mgl

+0

Вы избили меня до этого :) – Robbert

0

$ некоторых не является массивом так Еогеасп не будет работать на нем. Вам нужно сделать что-то вроде

$some = array(
    array(
     'name' => 'Licensing Module', 
     'nextduedate' => '2013-04-10', 
     'status' => 'Active' 
    ), 
    array(
     'name' => 'Test Addon', 
     'nextduedate' => '2013-04-11', 
     'status'=> 'Active' 
    ) 
); 

Это создаст многомерный массив, который вы можете пропустить.

function getActiveAddons($somet) { 
    $addons = array(); 
    foreach ($somet as $addon) { 
     foreach($addon as $key => $value) { 
      if ($key == 'status' && $value == 'Active') { 
       $addons[] = $addon['name']; 
       continue; 
      } 
     } 
    } 
    return $addons; 
} 
+0

Хорошо, спасибо. Можете ли вы изменить код так, чтобы он работал с $ some input, который определен? Большое спасибо: D – user2271353

+0

Большое спасибо за вашу помощь :) – user2271353

0

Во-первых, ваша переменная $ some - это просто строка. Вы можете разобрать строку в массив с помощью взрываются(), но это легче всего начать как массив:

$some = array(
    array(
     "name" => "Licensing Module", 
     "nextduedate" => "2013-04-10", 
     "status" => "Active", 
    ), 
    array(
     "name" => "Test Addon", 
     "nextduedate" => "2013-04-11", 
     "status" => "Active", 
    ) 
); 

Теперь для функции, вы находитесь на правильном пути, но я просто очистить его до:

function getActiveAddons($somet) { 
    if (!is_array($somet)) { 
     return false; 
    } 

    $addons = array(); 
    foreach ($somet as $addon) { 
     if ($addon['status'] == 'Active') { 
      $addons[] = $addon['name']; 
     } 
    } 

    if (count($addons) > 0) { 
     return $addons; 
    } 

    return false; 
} 

И, наконец, ваш выход (вы вызова функции дважды):

$result = getActiveAddons($some); 

if ($result === false) { 
    echo "No active addons!"; 
} 
else { 
    echo implode("<br />", $result); 
} 
+0

Большое спасибо за вашу помощь :) – user2271353

Смежные вопросы