Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Ассоциативный массив

Здравствуйте! Столкнулся с проблемой, которую не смог сам решить:
имеется ассоциативный массив:

Спойлер ()

Нужно найти полностью совпадающие ключи-массивы и посчитать их...
В идеале: удалить дубли, а к оригиналам добавить счетчик
Буду очень благодарен за помощь!

(Отредактировано автором: 18 Июля, 2015 - 05:08:26)

Ответ:
likvidator пишет:
имеется ассоциативный массив

Это точно ассоциативный массив?...)
Вопрос: Ассоциативный массив и данные в БД

Всем привет, вот не попрактикуешься неделю и всЁ становишься овощем.
И так имею ассоциативнй массив вида:
$import['ovosh'] = array (1,2,3,4,5);
$import['frukti'] = array ('arbuz','yabloko', 'grusha');



Задача добавить данные из массива в базу данных
$query = "INSERT INTO `imports`.`import` (ovosh,frukt) VALUES ("$ovoshi","$frukti")";
Что мне прописывать в значениях value ?
Первое что пришло в голову, это перебрать каждый массив через foreach  и после добавить, то есть
foreach ($import['ovosh'] as $ovoshi);
foreach ($import['frukt'] as $frukti);

Получается мне нужно каждый массив постоянно перебирать, чувствую, что такой подход ламерский, подскажите более простой способ?
Да я могу перебрать массив со значениями ключей, но как их к ассоциативному массиву для добавления в базу связать?

Спасибо!

Это сообщение отредактировал(а) sanitarn - 3.6.2015, 12:03
Ответ:
Цитата(ksnk @  3.6.2015,  16:46 )
А в каждой строке что должно быть? Для каждого фрукта каждый овощь?

Для каждого овоща, свой овощ )
Задача заполнить все поля в таблице, как лучше сделать с использованием 1 цикла, когда имеем ассоциативный массив с нужными данными.
Вопрос: Замена ключей ассоциативного массива значениями с суфиксами

Добрый день.
Суть моей задачи заключается в том, чтобы выбрать из базы по одному полю все записи, засунуть их в массив и отрендерить их в шаблоне по имени ключа массива.

Делаю запрос к базе:

PHP
1
$userquery = $this->db->query("SELECT name from users");
Делаю ассоциативный массив:

PHP
1
$data = $userquery->fetch_assoc()
Если его перебрать, то получаются следующий результат: 'name'=>'user1', 'name'=>'user2', и т.д. Мне же чтоб отрендерить все значения массива я перебираю все значения name c суфиксами 1,2,3 и если они существуют, то их вывожу.
Соответственно мне в массиве $data надо как то к ключам name добавить суффикс. Что то голову уже сломал, как это сделать.
Ответ: Пифагор,
Сообщение от Пифагор
судя по всему, foreach() каждый раз перебирает массив, состоящий из 1-го элемента
тоже думал об этом. Видимо я неправильно трактовал работу функции fetch_assoc. Я думал, что она делает из всех записей выборки массив, а она судя по всему делает массив из всех полей в одной записи, где ключи массива - это имена столбцов в бд, а значения массива - это значения записи в этом столбце. Поправьте, если не правильно.

Сообщение от Пифагор
По поводу задачи: вариант не универсальный, но для данного случае, думаю, подойдет.

$keys = [];
for($i=1; $i <= count($data); $i++){
* * $keys[] = "name$i";
}
print_r(array_combine($keys, $data));
Это помогло в решении моей задачи. Спасибо большущее!!! Только вот в итоге решил в ключe name$i значение $i все таки не циклом назначать, а привязать к id из бд, для того чтобы каждый юзер ссылался на страничку вида user/1 например. Но это я уже сам попробую. Еще раз спасибо.)
Вопрос: Создание ассоциативного массива из БД

Приветствую!
Прошу подсказки, а не сделать за меня
Приходит из формы произвольное количество ID ( name чекбоксов = exc[] )
При приеме собирается в текстовый ряд ID:

if( count($_GET['exc']) > 0 )
{
$exc = implode(', ',$_GET['exc']);
}

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

Жесть, короче, написал.

Посоветуете?
(Добавление)
Уточню:

Вывел таблицу с титлами статей, id статей в качестве value и чекбоксами.
Человек отметил те статьи, что ему интересны.
Запрос GET передал эти выбранные id.

PHP:

  1. if( ($_GET['id']) > 0 )
  2. {$exc = (',',$_GET['id']);}


Скидыщь! Красота - получили
CODE (html):

  1. 5,15,67


Теперь хорошо бы списочком опять тайтлы подвесить на выбранные id.

Добавляем сборку значений для запроса, выходит так:


PHP:

  1. if( ($_GET['id']) > 0 )
  2. {$exc = (',',$_GET['id']);
  3.  $excquery.= ' IN('.$exc.')';}



Получили запрос:
CODE (SQL):

  1. $query = "SELECT * FROM puk WHERE `id` = '$excquery'";
то есть
CODE (SQL):

  1. $query = "SELECT * FROM puk WHERE `id` = 'IN (5,15,67)' ";


Получили в ответ массив титлов.

И вот тут случается попа.

Если бы варианты выбора чекбоксов всегда были одинаковые, то


PHP:

  1. $puk[5] = 'Про любовь';
  2. $puk[15] = 'Про картошку';
  3. $puk[67] = 'Про соус Карри';



, далее


PHP:

  1. $exces= ();
  2. foreach ($_GET['id'] as $val) {
  3. $exces[] = $puk[$val];}
  4. $exces= (', ', $exces);
  5.  
  6. echo $exces;



Получили бы
CODE (html):

  1. Про любовь,Про картошку,Про соус Карри


НО!

Чекбоксы все время имеют разные ID, так как список статей для выбора (в самом начале путешествия) формируется на лету из базы, на основе и свежих поступлений. Поэтому заранее определенный ассоциативный массив - не катит. Получается его нужно собирать на лету.

И вот что делать бедному гусару, если список титлов нужен-нужен?
Ответ:
Если я правильно понимаю , в базе данных у вас записан Id и имя темы, вы посылает запрос с Id в MySQL , а он вам выдает данные этих строк в которых уже присутствует массив с названиями , вам остаеться только вывести его .
Вопрос: сортировка ключей многомерного ассоциативного массива по алфавиту php

Нужно отсортировать ключи многомерного ассоциативного массива по алфавиту

Есть такой массив

Array
(
[busy_usb_port] => Array
(
[0] => /dev/ttyUSB2
[1] => /dev/ttyUSB1
[2] => /dev/ttyUSB5
[3] => /dev/ttyUSB4
[4] => /dev/ttyUSB7
[5] => /dev/ttyUSB8
)

[all_usb_port] => Array
(
[0] => /dev/ttyUSB0
[1] => /dev/ttyUSB1
[2] => /dev/ttyUSB2
[3] => /dev/ttyUSB3
[4] => /dev/ttyUSB4
[5] => /dev/ttyUSB5
[6] => /dev/ttyUSB6
[7] => /dev/ttyUSB7
[8] => /dev/ttyUSB8
)

[free_usb_port] => Array
(
[0] => /dev/ttyUSB0
[3] => /dev/ttyUSB3
[6] => /dev/ttyUSB6
)

)

Надо получить

Array
(

[all_usb_port] => Array
(
[0] => /dev/ttyUSB0
[1] => /dev/ttyUSB1
[2] => /dev/ttyUSB2
[3] => /dev/ttyUSB3
[4] => /dev/ttyUSB4
[5] => /dev/ttyUSB5
[6] => /dev/ttyUSB6
[7] => /dev/ttyUSB7
[8] => /dev/ttyUSB8
)

[busy_usb_port] => Array
(
[0] => /dev/ttyUSB2
[1] => /dev/ttyUSB1
[2] => /dev/ttyUSB5
[3] => /dev/ttyUSB4
[4] => /dev/ttyUSB7
[5] => /dev/ttyUSB8
)

[free_usb_port] => Array
(
[0] => /dev/ttyUSB0
[3] => /dev/ttyUSB3
[6] => /dev/ttyUSB6
)

)

Как реализовать?
Ответ: а я сохранял массив в переменную.
$b = ksort($array);
print_r($b);
вывод был - 1.

если просто (как вы написали)
ksort($array);
print_r($array);
все ок.

спасибо.
Вопрос: [PHP] добавление в ассоциативный массив

ДОбрый день коллеги. прошу прощение за возможно глупый вопрос но он меня поставил в тупик..
Есть ассоциативный массив к примеру
$arr = array("name"=>"Иванов И.И.", "age"=>"25", "email"=>" ivanov@mail.ru ");
как к нему в цикле добавить следующие элементы??? Спасибо за помощь.
Ответ: Veritas, это вполне решаемая задача!

Вот код:

$input - массив в который необходимо добавить значение.
$refKey - относительно какого ключа.
$insertKey - новый ключ
$insertValue - новое значение

function insert_after(array $input, $refKey, $insertKey, $insertValue) {

if (!isset($input[$refKey]) || isset($input[$insertKey]))
return false;

$keys = array_keys($input);
$index = array_search($refKey, $keys);

$result = $input;
return array_slice($result, 0, $index + 1, true)
+ array($insertKey => $insertValue)
+ array_slice($result, $index + 1, null, true);
}

Вашновый массив на выходе:

$_array = insert_after($input, $refKey, $insertKey, $insertValue);

svp-post@mail.ru
Вопрос: Отдать ассоциативный массив JSON-у

php отдает объект, а нужно получить массив с ключами и значниями

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  foreach ($tariff['months_sales_percents'] as $month => $sale) {
        $months_count = round($sale * $month, 0, PHP_ROUND_HALF_UP);
        if ($months_count) {
            $tariff['months_gifts'][$month] = [
                'months' => $months_count,
                'text' => GetMessage($months_count . '_month_free'),
            ];
        }
    }
 
    // Считаем цену тарифа
    if ($tariff['PROPERTY_USERS_COUNT_VALUE'] > 0) {
        foreach ($tariff['prices'] as &$price) {
            $price /= $tariff['PROPERTY_USERS_COUNT_VALUE'];
        }
        unset($price);
 
        $tariff['PROPERTY_PRICE_VALUE'] /= $tariff['PROPERTY_USERS_COUNT_VALUE'];
    }
 
    $tariffs[$tariff["ID"]] = $tariff;
}
foreach($tariffs as $key){
    $result = $key["months_gifts"];
}
 
 
 
 
 
 
 
$values = array("val"=>$result);
echo json_encode($values);
если делать echo json_encode, то на выходе объект, который я не могу вставить в js, т.к. пишет Object Object. Если делаю print_r($values) получаю ассоциативный массив.
Ответ:
Сообщение от Jodah
Так разложите. В JS ведь тоже есть циклы, перебирающие массивы.
можно кодом?

Добавлено через 1 час 13 минут
через вот такую штуку

Javascript
1
data['val'].toSource();
удалось получить вот это

JSON
1
[{9:{months:1, text:"1_month_free"}, 10:{months:1, text:"1_month_free"}, 11:{months:1, text:"1_month_free"}, 12:{months:2, text:"2_month_free"}, 13:{months:2, text:"2_month_free"}, 14:{months:2, text:"2_month_free"}, 15:{months:2, text:"2_month_free"}, 16:{months:3, text:"3_month_free"}, 17:{months:3, text:"3_month_free"}, 18:{months:4, text:"4_month_free"}, 19:{months:4, text:"4_month_free"}, 20:{months:4, text:"4_month_free"}, 21:{months:5, text:"5_month_free"}, 22:{months:5, text:"5_month_free"}, 23:{months:5, text:"5_month_free"}, 24:{months:6, text:"6_month_free"}}]
что с этим делать не знаю))
Вопрос: Работа с массивами данных

Добрый вечер.
Возник вопрос по работе с массивами
есть 4 массива, самый "большой" имеет 1389 строк.
У всех имеется 5 столбцов, самый уникальный из них это ФИО.
в 4 массивах есть множество одинаковых ФИО.
эти массивы- разные приоритеты.
как можно сделать окошко, в котором вписывается ФИО и после условий( а именно, если чел. принес документы и приоритет один, то +, если иначе, то -, если у чел. приоритет 2, то этот чел. ищется в оставшихся массивах, когда находится,то смотрится сколько над ним принесших документов и если их меньше задонного числа, то -,если больше,то+ ) выдается цифра, сколько человек над данным индивидом. ?
В какую сторону копать ?
Код Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub UserForm_Click()
 Dim SH As Worksheet, sh2 As Worksheet, sh3 As Worksheet, sh4 As Worksheet
            Set SH = ThisWorkbook.Worksheets("лист1")
        lastrow = SH.Cells(SH.Rows.Count, 2).End(xlUp).row
        Dx = SH.Range("A1:E" & lastrow)
            Set sh2 = ThisWorkbook.Worksheets("лист1")
        lastrow = sh2.Cells(sh2.Rows.Count, 8).End(xlUp).row
        Dx2 = sh2.Range("G1:K" & lastrow)
                Set sh3 = ThisWorkbook.Worksheets("лист1")
        lastrow = sh3.Cells(sh3.Rows.Count, 8).End(xlUp).row
        Dx3 = sh3.Range("M1:Q" & lastrow)
                Set sh4 = ThisWorkbook.Worksheets("лист1")
        lastrow = sh4.Cells(sh4.Rows.Count, 8).End(xlUp).row
        Dx4 = sh4.Range("S1:W" & lastrow)
        End Sub
Ответ:

Не по теме:

Сообщение от Vladikslav
у одних и тех же людей могут быть разные приоритеты
например в массиве 1-ом 1-ый приоритет
в массива 3-ом 2-ой приоритет
да создать форму с полем для ввода фио и выбора массива.
там подсчитывается сколько человек с приоритетом 1 до данного фио принесли документы
потом считается сколько человек с 2-ым приоритетом принесли документы, если такие имеются, то ищется массив, где у этого человека 1-ый приоритет и считается сколько над ним принесли документы, соответственно считаются только 1-ый приоритет. если число этих людей меньше определенной величины,тогда он не считается, если больше, тогда счетчик увеличивается
без блок-схемы не понять...

Вопрос: Создать Библиотеку для работы с массивами целых чисел

Создать библиотеку для работы с массивами целых чисел.. В библиотеку включить
1)метод поиска максимального элемента массива.,
2)метод поиска минимального элемента массива и метод обмена значениями максимального и минимального элементов массива..
3)В программе предусмотреть создание и печать массива, обмен значениями максимального и минимального элементов и печать нового массива..
Ответ: Zorroo, смотри, можешь взять в качестве основы. У меня это класс "Матрица" (т.е. двумерный массив). Там, в принципе, несложно переделать в одномерный массив. Тебе останется написать только функцию-член обмена значений. Что-нибудь типа:
Код C++
1
Item swap(Item first, Item second);
Потом в качестве параметров в эту функцию просто подставляй вызов find_max_value() и find_avg_value() и она будет менять местами максимальный и минимальный элементы.
Вопрос: Создать класс для работы с массивами

Начал создавать класс для работы с массивами. Он создает массивы, но всегда возвращает одинаковые их значения. Как сделать так чтобы значения внутри массива всегда были разными.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 class CreatArray
    {
        int i ;
        int a=1, b=10;
        int[] array ;
 
 
        public CreatArray() : this(5) { }
        public CreatArray(int i)
        {
            this.i = i;         
        }
 
        public void mas(ref int[] list) 
        {
            
            int[] arr1 = new int[list.Length];
            var r = new Random();
         
            for (int i = 0; i < this.i; i++)
                arr1[i] = r.Next(a,b);
            list = arr1;
        
            
        }
 
        public void ShowArray(int[] list) 
        {
            Console.WriteLine();
            for (int i = 0; i < this.i; i++)
                Console.Write("{0} ", list[i]);
            Console.WriteLine();
        }
        
    }
Ответ:
Сообщение от Максат
чтобы значения внутри массива всегда были разными.
Инициализировать начало рандомизации случайным (зависящим от времени) числом. типа srand()