Выдержка из массива Php с использованием условий - PullRequest
3 голосов
/ 26 июня 2010

Я хотел бы извлечь группы данных из массивов PHP в зависимости от "RouterName". Итак, в итоге я получу 4 больших массива (ArrDeviceA, ArrDeviceB и т. Д.)

Я не хочу использовать foreach, зацикливать все строки и помещать их в отдельный массив. Более того, может быть вероятность того, что некоторые массивы могут содержать более 3 строк. Количество строк не является постоянным.

Есть ли какая-либо функция для запроса массива в PHP?
альтернативный текст http://img208.imageshack.us/img208/7616/18077470.jpg

Необработанные данные массива php:

Array
(
    [0] => Array
        (
            [RouterName] => DeviceA
            [Reference] => R2a
            [AverageRSSI] => -36.00
            [AverageQuality] => 63.00
            [Date_Time] => 12-June-2010
        )

    [1] => Array
        (
            [RouterName] => DeviceA
            [Reference] => R2a
            [AverageRSSI] => -51.03
            [AverageQuality] => 47.97
            [Date_Time] => 11-June-2010
        )

    [2] => Array
        (
            [RouterName] => DeviceA
            [Reference] => R2a
            [AverageRSSI] => -53.63
            [AverageQuality] => 45.37
            [Date_Time] => 10-June-2010
        )

    [3] => Array
        (
            [RouterName] => DeviceB
            [Reference] => R2
            [AverageRSSI] => -38.19
            [AverageQuality] => 60.81
            [Date_Time] => 12-June-2010
        )

    [4] => Array
        (
            [RouterName] => DeviceB
            [Reference] => R2
            [AverageRSSI] => -38.64
            [AverageQuality] => 60.36
            [Date_Time] => 11-June-2010
        )

    [5] => Array
        (
            [RouterName] => DeviceB
            [Reference] => R2
            [AverageRSSI] => -38.67
            [AverageQuality] => 60.33
            [Date_Time] => 10-June-2010
        )

    [6] => Array
        (
            [RouterName] => DeviceC
            [Reference] => SCN1010
            [AverageRSSI] => -69.12   
            [AverageQuality] => 29.88
            [Date_Time] => 12-June-2010
        )

    [7] => Array
        (
            [RouterName] => DeviceC
            [Reference] => SCN1010
            [AverageRSSI] => -70.99
            [AverageQuality] => 28.01
            [Date_Time] => 11-June-2010
        )

    [8] => Array
        (
            [RouterName] => DeviceC
            [Reference] => SCN1010
            [AverageRSSI] => -71.52
            [AverageQuality] => 27.48
            [Date_Time] => 10-June-2010
        )

    [9] => Array
        (
            [RouterName] => DeviceD
            [Reference] => SCN1020
            [AverageRSSI] => -62.48
            [AverageQuality] => 36.52
            [Date_Time] => 12-June-2010
        )

    [10] => Array
        (
            [RouterName] => DeviceD
            [Reference] => SCN1020
            [AverageRSSI] => -34.60
            [AverageQuality] => 64.40
            [Date_Time] => 11-June-2010
        )

    [11] => Array
        (
            [RouterName] => DeviceD
            [Reference] => SCN1020
            [AverageRSSI] => 0.00
            [AverageQuality] => 99.00
            [Date_Time] => 10-June-2010
        )

)

Ответы [ 3 ]

3 голосов
/ 26 июня 2010

Я не хочу использовать foreach и циклически повторять все строки и помещать их в отдельный массив.

Почему? Это 4 строки кристально чистого кода, и вы даже можете сохранить строку ... Оставайтесь простыми.

$indexedByRouterName = array();
foreach ($array as $key => $value) {
    $routerName = $value['RouterName'];
    $indexedByRouterName[$routerName][] = $value;
}

Неизвестное количество строк не является проблемой, если вы используете оператор [].

2 голосов
/ 26 июня 2010

Is there any function to query the array in PHP?

В PHP вы можете использовать функцию in_array() (http://www.php.net/manual/en/function.in-array.php), чтобы проверить, существует ли какой-либо ключ, и array_search() (http://www.php.net/manual/en/function.array-search.php), которыйвыполняет почти то же самое для функции in_array(), но возвращает логическое значение массива вместо логического значения.

Они не будут запрашивать функцию mysql_query(), но вы можете сделать что-то вроде этого:

function array_query($array,$what){
    if(in_array($what, $array)){
         return $array[array_search($what, $array)];
    }
    return false;
}

Надеюсь, эта работа для вас

РЕДАКТИРОВАТЬ: Я нашел array_search() как для многомерных массивов (ваш пример), код выше, вам нужно только торговать намоя функция array_search($what, $array) с функцией recursiveArraySearch($array,$what):

function recursiveArraySearch($haystack, $needle, $index = null)
{
    $aIt     = new RecursiveArrayIterator($haystack);
    $it    = new RecursiveIteratorIterator($aIt);

    while($it->valid())
    {       
        if (((isset($index) AND ($it->key() == $index)) OR (!isset($index))) AND ($it->current() == $needle)) {
            return $aIt->key();
        }

        $it->next();
    }

    return false;
} 
1 голос
/ 26 июня 2010

Существует библиотека SQL4Array от absynthe, которая позволяет выполнять запросы SQL к массиву PHP.Я не верю, что он пока поддерживает предложения GROUP BY, но может предоставить альтернативу другим методам поиска в массивах

...