Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объединение всех пересечений массива 
:(
    Опции темы
Aliance
Дата 4.5.2012, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Есть два массива. Их длины никак не соотносятся, т.е. первый может быть больше второго, наоборот или же они оба равны. Например:
Код

            $a1 = array(
                689 => array(
                    'cnt1' => 13,
                    'partner_login' => 'Aliance',
                    'summ1' => 123.45
                ),
                1721 => array(
                    'cnt1' => 45,
                    'partner_login' => 'maxwell',
                    'summ1' => 100
                )
            );
            $a2 = array(
                100500 => array(
                    'cnt2' => 69,
                    'partner_login' => 'test',
                    'summ2' => 500
                ),
                1721 => array(
                    'cnt2' => 87,
                    'partner_login' => 'maxwell',
                    'summ2' => 200
                )
            );

Нужно нарисовать html табличку такого вида:
Код

<table>
    <thead>
        <tr>
            <th>Партнёр</th>
            <th>Кол-во</th>
            <th>Суммарный доход</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>13</td>
            <td>123.45</td>
            <td><a href="/admin/users/view/689">Aliance</a></td>
            <td>-</td>
            <td>-</td>
        </tr>
        <tr>
            <td>45</td>
            <td>100</td>
            <td><a href="/admin/users/view/1721">maxwell</a></td>
            <td>87</td>
            <td>200</td>
        </tr>
        <tr>
            <td>-</td>
            <td>-</td>
            <td><a href="/admin/users/view/100500">test</a></td>
            <td>69</td>
            <td>500</td>
        </tr>
    </tbody>
</table>


Таким образом мне нужно получить из исходных 2 массивов массив вида:
Код

            $a0 = array(
                689 => array(
                    'cnt1' => 13,
                    'partner_login' => 'Aliance',
                    'summ1' => 123.45
                ),
                1721 => array(
                    'cnt1' => 45,
                    'partner_login' => 'maxwell',
                    'summ1' => 100
                    'cnt2' => 87,
                    'summ2' => 200
                ),
                100500 => array(
                    'cnt2' => 69,
                    'partner_login' => 'test',
                    'summ2' => 500
                )
            );

И дальше уже из него делать foreach, что в легко.
Трудность возникает при формировании такого массива.

Я решил эту проблему таким способом:
Код

            $a0 = array();
            foreach ($a1 as $k => $v)
            {
                $a0[$k] = $v;
            }
            foreach ($a2 as $k => $v)
            {
                if (array_key_exists($k, $result))
                {
                    $a0[$k]['cnt2'] = $v['cnt2'];
                    $a0[$k]['summ2'] = $v['summ2'];
                    // ну или array_merge() без разницы
                }
                else
                    $a0[$k] = $v;
            }
            var_dump( $a0 );

Но такой код из-за двух foreach по всем элементам писать я считаю не комильфо.
Ну, естественно что варианты аля таких я пробовал и ни одно не подошло...
Код

$a0 = array_merge($a1, $a2);
$a0 = array_merge_recursive($a1, $a2);
$a0 = array_merge(array_diff($a1, $a2), array_diff($a2, $a1));


Ваши варианты?
PM MAIL WWW ICQ Skype   Вверх
Sentox
Дата 4.5.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


Профиль
Группа: Участник
Сообщений: 392
Регистрация: 27.1.2009
Где: Зимбабве

Репутация: 7
Всего: 7



Преобразовать ключи в строковые и сливать array_merge();
PM MAIL   Вверх
Aliance
Дата 4.5.2012, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Забыл уточнить, про ньюанс со строковыми ключами знаю. Добавил 'u' к ключам - ничего не дало, результат работы нативных merge все равно не устраивает.
PM MAIL WWW ICQ Skype   Вверх
ksnk
Дата 4.5.2012, 15:40 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Экий вы , батенька, привередливый  smile 

Вот чудище ужасное, для утех сексуальных... Итератор, называется.
Код

class myIterator implements Iterator {
    private $a1,$a2,$keys;

    private $position = 0;

    public function __construct(&$a1,&$a2) {
        $this->a1=&$a1;
        $this->a2=&$a2;
        $this->keys=array_unique (array_merge(array_keys($a1),array_keys($a2)));
    }

    function rewind() {
        $this->position = 0;
    }

    function current() {
        $key=$this->keys[$this->position];
        if(array_key_exists($key,$this->a1)){
            if(array_key_exists($key,$this->a2)){
                return array_merge($this->a1[$key],$this->a2[$key]);
            } else
                return $this->a1[$key] ;
        } else
            return $this->a2[$key];
    }

    function key() {
        return $this->keys[$this->position];
    }

    function next() {
        ++$this->position;
    }

    function valid() {
        return isset($this->keys[$this->position]);
    }
}

$a1 = array(
    689 => array(
        'cnt1' => 13,
        'partner_login' => 'Aliance',
        'summ1' => 123.45
    ),
    1721 => array(
        'cnt1' => 45,
        'partner_login' => 'maxwell',
        'summ1' => 100
    )
);
$a2 = array(
    100500 => array(
        'cnt2' => 69,
        'partner_login' => 'test',
        'summ2' => 500
    ),
    1721 => array(
        'cnt2' => 87,
        'partner_login' => 'maxwell',
        'summ2' => 200
    )
);


$it = new myIterator($a1,$a2);

foreach($it as $key => $value) {
    var_dump($key, $value);
    echo "\n";
}


Это сообщение отредактировал(а) ksnk - 4.5.2012, 15:43


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Aliance
Дата 4.5.2012, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



ksnk, за вариант решения спасибо, но не думаю что в оно шибко лучше моего smile 
Я-то написал сюда в надежде что я заработался в пятницу и не могу сообразить решения в одну строчку нативными методами аля
Код

$a0 = array_merge(array_diff($a1, $a2), array_diff($a2, $a1), array_intersect($a1, $a2));

Но коли уж никому в голову оного также не приходит - видимо его не существует и обойдемся 2 циклами моими smile 
PM MAIL WWW ICQ Skype   Вверх
baldina
Дата 4.5.2012, 16:07 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 26
Всего: 101



Код

foreach (array(&$a1, &$a2) as $a)
  foreach ($a as $key1=>$v)
    foreach ($v as $key2=>$value)
      $result[$key1][$key2] = $value;


Добавлено через 2 минуты и 1 секунду
Цитата(Aliance @  4.5.2012,  15:51 Найти цитируемый пост)
решения в одну строчку нативными методами

нет, к сожалению. можно array_udiff ($a1+$a2, $a2+$a1)со своим callback, но это не проще и не в одну

Добавлено через 7 минут и 50 секунд
http://codepad.org/VeV9i9eB
PM MAIL   Вверх
Fortop
Дата 4.5.2012, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Я в панике люди....



Код

<?php
 $a1 = array(
                689 => array(
                    'cnt1' => 13,
                    'partner_login' => 'Aliance',
                    'summ1' => 123.45
                ),
                1721 => array(
                    'cnt1' => 45,
                    'partner_login' => 'maxwell',
                    'summ1' => 100
                )
            );
            $a2 = array(
                100500 => array(
                    'cnt2' => 69,
                    'partner_login' => 'test',
                    'summ2' => 500
                ),
                1721 => array(
                    'cnt2' => 87,
                    'partner_login' => 'maxwell',
                    'summ2' => 200
                )
            );
print_r($a1+$a2);


Код

Array
(
    [689] => Array
        (
            [cnt1] => 13
            [partner_login] => Aliance
            [summ1] => 123.45
        )

    [1721] => Array
        (
            [cnt1] => 45
            [partner_login] => maxwell
            [summ1] => 100
        )

    [100500] => Array
        (
            [cnt2] => 69
            [partner_login] => test
            [summ2] => 500
        )

)




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 4.5.2012, 20:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Fortop, А неправильно  smile 
Должно быть 
Цитата

1721=>
array
  'cnt1' => int 45
  'partner_login' => string 'maxwell' (length=7)
  'summ1' => int 100
  'cnt2' => int 87
  'summ2' => int 200



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 4.5.2012, 22:00 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



Цитата(ksnk @  4.5.2012,  20:09 Найти цитируемый пост)
Fortop, А неправильно   

Действительно smile не обратил внимания на это требование.

Тогда в копилку извращений smile
Код

array_map(function($param) use (&$result) {
    array_walk($param, function($val, $key) use (&$result) {
            $result[$key] = (array) $result[$key] + $val;
        });
    }, 
    array($a1, $a2));
var_dump($result);


Добавлено через 1 минуту и 50 секунд
Ну или с проверкой

Код

    isset($result[$key]) ? $result[$key] += $val : $result[$key] = $val;



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Aliance
Дата 5.5.2012, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 14
Всего: 137



Fortop, ну да с конкатенацией массива конечно же пробовал  smile 

Спасибо за еще один вариант, но пока все же придерживаюсь своего.) Он менее изящный чем некоторые предложенные здесь, зато другие программисты, увидевшие данный кусочек кода через пару лет не будут сильно матерится, не понимая "шо цэ таке")
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0558 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.