php - рекурсивний поиск по массиву с поиском regex ключа

284
18 июня 2017, 18:05

Имеется массив:

[my:МоиПоля] => Array
    (
        [attr] => Array
            (
                [xmlns:xsi] => http://www.w3.org/2001/XMLSchema-instance
                [xmlns:pc] => http://schemas.microsoft.com/office/infopath/2007/PartnerControls
                [xmlns:ma] => http://schemas.microsoft.com/office/2009/metadata/properties/metaAttributes
                [xmlns:d] => http://schemas.microsoft.com/office/infopath/2009/WSSList/dataFields
                [xmlns:q] => http://schemas.microsoft.com/office/infopath/2009/WSSList/queryFields
                [xmlns:dfs] => http://schemas.microsoft.com/office/infopath/2003/dataFormSolution
                [xmlns:dms] => http://schemas.microsoft.com/office/2009/documentManagement/types
                [xmlns:my] => http://schemas.microsoft.com/office/infopath/2003/myXSD/2016-04-22T08:03:54
                [xmlns:xd] => http://schemas.microsoft.com/office/infopath/2003
                [xml:lang] => uk-UA
            )
        [my:ODM_Total] => Array
            (
                [my:Date] => Array
                    (
                        [value] => 2017-05-09
                    )
                [my:TotalScore] => Array
                    (
                        [value] => 384
                    )
                [my:Description] => Array
                    (
                    )
                [my:Manager] => Array
                    (
                        [value] => "I"
                    )
                [my:Store] => Array
                    (
                        [value] => 3101
                    )
            )
        [my:Clean] => Array
            (
                [my:Total_Clean] => Array
                    (
                        [value] => 63
                    )
                [my:CH_1] => Array
                    (
                        [value] => true
                    )
                [my:L_1] => Array
                    (
                        [value] => 5
                    )
                [my:CH_2] => Array
                    (
                        [value] => true
                    )
                [my:L_2] => Array
                    (
                        [value] => 5
                    )
                [my:CH_3] => Array
                    (
                        [value] => true
                    )
                [my:CH_4] => Array
                    (
                        [value] => true
                    )
                [my:L_4] => Array
                    (
                        [value] => 5
                    )
                [my:L_3] => Array
                    (
                        [value] => 5
                    )
                [my:CH_5] => Array
                    (
                        [value] => false
                    )
                [my:L_5] => Array
                    (
                    )
                [my:CH_6] => Array
                    (
                        [value] => true
                    )
                [my:L_6] => Array
                    (
                        [value] => 5
                    )

И т.д.

Нужно сделать функцию для поиска за ключом в виде "/my:CH_\d+/" и чтобы в результате получился массив:

array(
    [my:CH_1]=>array(
            [value]=>true
        )  ...

На данный момент есть только вот такая функция:

function searchExc($array, $key)
{
    $results = array();
    if (is_array($array)) {
        foreach ($array as $key2=>$subarray) {
          if (preg_match($key,$key2))
            if(is_array($array[$key2]) && isset($array[$key2]['value'])) {
                $results[] = $array;
          }
            $results = array_merge($results, searchExc($subarray, $key, $value));
        }
    }
    return $results;
}

но она не выводит то что надо... Она выводит это:

Array
(
[0] => Array
    (
        [my:Total_Clean] => Array
            (
                [value] => 63
            )
        [my:CH_1] => Array
            (
                [value] => true
            )
        [my:L_1] => Array
            (
                [value] => 5
            )
        [my:CH_2] => Array
            (
                [value] => true
            )
        [my:L_2] => Array
            (
                [value] => 5
            )
        [my:CH_3] => Array
            (
                [value] => true
            )
        [my:CH_4] => Array
            (
                [value] => true
            )
        [my:L_4] => Array
            (
                [value] => 5
            )
        [my:L_3] => Array
            (
                [value] => 5
            )

что-то не так с функцией, поэтому прошу помочь.
Искал по всем ресурсам и не могу найти...
Наперед спасибо за ответы.

Дополнительно:

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

Answer 1
$input=['k1'=>['my:CH_1'=>['a'=>'b'],'c'=>'b'],'k2'=>'v2','my:CH_2'=>'k2'];
$output = [];
function walk($input, &$output){
    foreach($input as $key => $value){
        if(substr($key, 0, 6) === 'my:CH_') $output[$key] = $value;
        if(is_array($value)) walk($value, $output);
    }
}
walk($input, $output);
var_dump($output);

sandbox

READ ALSO
блокировка записи в mysql

блокировка записи в mysql

Доброго времени суток! Подскажите, как правильно реализовать блокировку записи в MySQL

269
PHP обход chmod

PHP обход chmod

Здравствуйте! Скажите, как можно сменить права на файл, если функция chmod отключена? Возможно есть вариант через создание своей функции?

254