PHP Array выбор результатов - PullRequest
0 голосов
/ 11 ноября 2009

Если у меня есть следующий массив:

$Unmanaged =    array(
                array('name' => 'SD2005', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
                array('name' => 'SD2008', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
                array('name' => 'SR2016', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
                array('name' => 'SR2024', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
                array('name' => 'SR2024C', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
                array('name' => 'SD205', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
                array('name' => 'SD208', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
                array('name' => 'SD216', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
                array('name' => 'SR224G', 'speed' => '100', 'size' => 'rack', 'uplink' => 'yes'),
                array('name' => 'SR216', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
                array('name' => 'SR224', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
                array('name' => 'SR224R', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no')
                );

как бы мне перебрать все записи, возвращая все записи, которые соответствуют определенным критериям, например: все переключатели со скоростью: 100, размер: desk и uplink: нет?

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

Спасибо, Бен

Ответы [ 7 ]

5 голосов
/ 11 ноября 2009

Вот как вы можете сделать это, используя array_filter():

function my_callback($elem) {
    return $elem['speed']==100 && $elem['size']=='desk' && $elem['uplink']=='no';
}

$results = array_filter($Unmanaged, 'my_callback');

Используя анонимные функции PHP 5.3, вы можете сделать выбранные значения динамическими во время выполнения:

function create_callback($speed, $size, $uplink) {
    return function ($elem) use ($speed, $size, $uplink) { 
        return $elem['speed']==$speed && $elem['size']==$size && $elem['uplink']==$uplink;
    };
}

$results = array_filter($unmanaged, create_callback(100, 'desk', 'no'));

Редактировать : Как вы только что прокомментировали, вам просто нужно имя переключателя. Нет проблем; после использования любого из указанных выше решений вы можете добавить:

function get_name($elem) { return $elem['name']; }
$names = array_map('get_name', $results);
1 голос
/ 11 ноября 2009

Что-то вроде следующего? Используя этот метод, вы можете включить все виды проверки условий и не забывайте, что вы также можете использовать или "||" для выбора набора результатов.

foreach($Unmanaged as $result)
{
    if($result['speed'] == "100" && $result['size'] == "desk" && $result['uplink'] == "no")
    {
        echo $result['name'];
    }

}
0 голосов
/ 11 ноября 2009

В отличие от других комментариев, я бы предложил использовать базу данных. Это именно то, для чего нужны базы данных, и они могут быть гораздо лучше, чем php.

0 голосов
/ 11 ноября 2009

Могу также опубликовать мое решение ..

function matchElement($haystack, $needleArray) {
    $result = array();
    for($i = 0, $c = count($haystack); $i < $c; $i++) {
        $matchall = true;
        foreach($needleArray as $k => $v) {
            if(!isset($haystack[$i][$k]) || $haystack[$i][$k] != $v) {
                $matchall = false;
                break;
            }
        }
        if($matchall) {
            $result[] = $haystack[$i];
        }
    }

    return $result;
}

print_r(matchElement($Unmanaged, array("speed" => 100, "size" => "rack")));
0 голосов
/ 11 ноября 2009

Другой вариант, где ограничения являются переменными:

function matches($values, $constraints) {
    $hits = array();
    foreach($values as $val) {
        $ok = true;
        foreach($constraints as $k => $v) {
            if($val[$k] != $v) $ok = false;
        }
        if($ok) $hits[] = $val;
    }
    return $hits;
}

$Unmanaged = array(
    array('name' => 'SD2005', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SD2008', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SR2016', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR2024', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR2024C', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SD205', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SD208', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SD216', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SR224G', 'speed' => '100', 'size' => 'rack', 'uplink' => 'yes'),
    array('name' => 'SR216', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR224', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR224R', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no')
);

print_r(matches($Unmanaged, array('speed'=>'100', 'size'=>'desk', 'uplink'=>'no')));

Выход:

Array
(
    [0] => Array
        (
            [name] => SD205
            [speed] => 100
            [size] => desk
            [uplink] => no
        )

    [1] => Array
        (
            [name] => SD208
            [speed] => 100
            [size] => desk
            [uplink] => no
        )

    [2] => Array
        (
            [name] => SD216
            [speed] => 100
            [size] => desk
            [uplink] => no
        )

)
0 голосов
/ 11 ноября 2009

здесь вы идете:

function getSwitches($switches,$speed=100,$size='desk',$uplink='no')
{
    $sw = array();

   foreach($switches as $s)
   {
    if(
        $s['speed'] == $speed &&
        $s['size'] == $size &&
        $s['uplink'] == $uplink
    )

    $sw[] = $s;
   }

   return $sw;
}

print_r(getSwitches($Unmanaged,100,'desk','no'));
0 голосов
/ 11 ноября 2009

какая-то опция для запуска в массиве:

  1. foreach ($ array as $ key => $ val)
  2. while (список ($ key, $ val) = each ($ array)) {
  3. array_walk ($ массив, FUNC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...