Объединение значений в цикле foreach на основе условия предварительного совпадения - PullRequest
0 голосов
/ 29 декабря 2018

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

Мои данные находятся в массиве, подобном следующему:

[0] => Array
    (
        [subject] => math
        [price] => 5
        [year] => 2006
    )

[1] => Array
    (
        [subject] => reading
        [price] => 7
        [year] => 2007                                              
        [author] => Smith
        [publisher] => Press
    )

[2] => Array
    (
        [subject] => reading
        [price] => 9        
        [year] => 2008                                                              
        [author] => Jones
        [copyright] => 1999
    )

Myкод:

$count = count($array); 
for ($i = 0; $i < $count; $i++) {
        foreach($array[$i] as $name => $value) {
                if(preg_match('(subject|price|year)', $name) != 1) { 
                        @$desc .= '-'.$name.'-'.$value;
                } else {
                        $desc = ''; 
                }
                echo $i.' : '.$desc.'<br />';
        }                       
}

Мой желаемый вывод из приведенного выше кода будет:

0 : subject-math / price-5 / year-2006
1 : subject-reading / price-7 / year-2007 / author-Smith-publisher-Press
2 : subject-reading / price-9 / year-2008 / author-Jones-copyright-1999

Основная проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как комбинировать и выводитьвсе пары имя-значение, которые не соответствуют условию preg_match.По сути тема, цена и год, общие для каждой записи, но для всех остальных я хочу иметь доступ ко всем слитым вместе как к одному элементу.

Заранее благодарен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Думаю, это будет самая простая реализация:

foreach ($array as $index => $item)
{
    $result = array_filter
    ([
        'subject-' . array_shift($item),
        'price-'   . array_shift($item),
        'subject-' . array_shift($item),

        implode('-', $item)
    ]);

    $result = implode(' / ', $result);

    echo "$index: $result\n";
}
0 голосов
/ 29 декабря 2018

Этот код будет делать то, что вы хотите.Он проходит по вашему массиву, помещая все пары ключ-значение в массив, а затем повторяя взлет (с /) массива.Значения для subject, price и year имеют свои собственные записи, в то время как все другие значения помещаются в массив, который затем также сжимается с помощью - для получения желаемого результата.Вместо использования preg_match для сопоставления клавиш вместо него используется простой in_array:

foreach ($data as $k => $d) {
    $out = array();
    foreach ($d as $key => $value) {
        if (in_array($key, ['subject', 'price', 'year'])) {
            $out[] = "$key-$value";
        }
        else {
            $out['others'][] = "$key-$value";
        }
    }
    if (isset($out['others'])) $out[] = implode('-', $out['others']);
    unset($out['others']);
    echo "$k : " . implode(' / ', $out) . "\n";
}

Вывод:

0 : subject-math / price-5 / year-2006
1 : subject-reading / price-7 / year-2007 / author-Smith-publisher-Press 
2 : subject-reading / price-9 / year-2008 / author-Jones-copyright-1999

Демонстрация на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...