За последние 24 часа нас посетили 15148 программистов и 1674 робота. Сейчас ищут 829 программистов ...

Собрать массив из одинаковых значений

Тема в разделе "PHP для новичков", создана пользователем zhenia3003, 12 авг 2018.

  1. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Это таблица 1 со значениями id таблицы 2.
    [​IMG]
    Это таблица 2.
    [​IMG]
    Нужно создать 2 массива, которые будут разделяться по столбце "NAME", т.е. нужно как то разделить на array('Размер'=>'1', 'Размер'=>'2', 'Размер'=>'3') и array('Цвет'=>'31', 'Цвет'=>'32', 'Цвет'=>'33')
    Пробовал сделать следующее, но не вышло, прошу помощи.
    PHP:
    1. $data = explode(',', $rows['value']);
    2. foreach ($data as $key) {
    3. $d = mysqli_fetch_array(mysqli_query($db, "SELECT id, name FROM value WHERE id = '{$key}' "));
    4. $r[] = array($d[0]=>$d[1]);
    5. }
     
  2. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Если я правильно понял, то:
    PHP:
    1. $r[$d[0]] = $d[1];
     
  3. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Нет, мне нужно получить 2 массива по уникальному столбцу NAME
     
  4. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    PHP:
    1. (
    2.     [1] => Размер
    3.     [32] => Цвет
    4.     [2] => Размер
    5.     [31] => Цвет
    6.     [3] => Размер
    7.     [33] => Цвет
    8. )
    Этот массив нужно разделить на два по размеру и цвету
    Результат должен быть таким:
    PHP:
    1. (
    2.     [1] => Размер
    3.     [2] => Размер
    4.     [3] => Размер
    5. )
    6. (
    7.     [32] => Цвет
    8.     [31] => Цвет
    9.     [33] => Цвет
    10. )
     
  5. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Вот так наверное:
    PHP:
    1. $a = array(1 => 'select',  2 => 'select',  3 => 'select',
    2. 31 => 'checkbox', 32 => 'checkbox', 33 => 'checkbox');
    3.  
    4. $b =[];
    5. $c =[];
    6.  
    7. foreach ($a as $key => $val)
    8. {
    9.     if($val == 'select') {  $b[$key] = $val;};
    10.     if($val == 'checkbox') { $c[$key] = $val; };
    11. }
     
  6. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    А как сделать это динамически? через foreach и array_unique ?
     
  7. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    А чем тебе сейчас не динамически, вставь в конец sql запроса, подмени $a своим массивом.
     
  8. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    В Вашем варианте в массиве if select, if checkbox - значения могут различаться, поэтому нужен динамический вариант
     
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    специально зарегистрировался на этом форуме ради этой темы
    думаю ссылки на конкурентов тут не приветствуются, поэтому процитирую сам себя
     
  10. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @zhenia3003
    Ну так тогда можно:
    PHP:
    1. $a = array(
    2.     1 => 'select',
    3.     2 => 'select',
    4.     3 => 'select',
    5.     31 => 'checkbox',
    6.     32 => 'checkbox',
    7.     33 => 'checkbox'
    8. );
    9. $a2 = [];
    10. foreach ($a as $key => $value) {
    11.     $a2[$value][$key] = $value;
    12.     unset($a[$key]);
    13. }
    14. print_r($a2);
    Результат будет таким:
    Код (Text):
    1.  
    2. Array (
    3.       [select] => Array (
    4.               [1] => select
    5.               [2] => select
    6.               [3] => select
    7.        )
    8.       [checkbox] => Array (
    9.               [31] => checkbox
    10.               [32] => checkbox
    11.               [33] => checkbox
    12.        )
    13. )
    Больше у меня идей нет=)
     
    #10 Artur_hopf, 13 авг 2018
    Последнее редактирование: 13 авг 2018
  11. zhenia3003

    zhenia3003 Активный пользователь

    С нами с:
    20 авг 2012
    Сообщения:
    184
    Симпатии:
    3
    Artur_hopf, спасибо), хороший вариант, я почти до такого дошел, у Вас он короче, чем мой:
    PHP:
    1.     function itemSelect(){
    2.         global $rows, $db;
    3.         if(strlen($rows['content_value']) > 0){
    4.             $data = explode(',', $rows['content_value']);
    5.             foreach ($data as $val) {
    6.                 $d = mysqli_fetch_array(mysqli_query($db, "SELECT id, tag, name, title, value, cost FROM content_value WHERE id = '{$val}' "));
    7.                 // $p[$d[0]] = $d[1];
    8.                 $p[] = array("id" => $d[0], "name" => $d[1]);
    9.             }
    10.  
    11.             $results = array();
    12.             foreach ($p as $page) {
    13.                 $results[$page["name"]][] = $page["id"];
    14.             }
    15.  
    16.             // natsort($p);
    17.             echo '<pre>';
    18.             print_r($results);
    19.             echo "<br><br></pre>";
    20.         }
    21.     }
     
  12. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Никогда не засовывай SQL запросы в цикл. Тебе это выйдет потом боком.
     
  13. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Вариант чёт больше чем выше.
    PHP:
    1. <?php
    2.  
    3. $arr = Array
    4. (
    5.     1 => 'Размер',
    6.     32 => 'Цвет',
    7.     2 => 'Размер',
    8.     31 => 'Цвет',
    9.     3 => 'Размер',
    10.     33 => 'Цвет'
    11. );
    12.  
    13. $keys = [];
    14. $found = [];
    15. $result = [];
    16.  
    17. foreach($arr as $needle) {
    18.     $res = array_keys($arr, $needle);
    19.     if($res && !in_array($needle, $found)) {
    20.        $keys[] = $res;
    21.        $found[] = $needle;
    22.     }
    23. }
    24.  
    25. for($i = 0; $i < count($keys); $i++) {
    26.     foreach($keys[$i] as $val) {
    27.         $result[$i][$val] = $arr[$val];
    28.     }
    29. }
    30.  
    31. var_dump($result);