Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Voka
206 / 198 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
1

Массив ключей из ключей двух массивов

25.03.2014, 17:54. Просмотров 1464. Ответов 14
Метки нет (Все метки)

Добрый день.
Необходимо собрать все ключи с двух массивов как можно эффективнее и менее ресурсозатратно.
Например есть два ассоциативных массива:
Код
Array1()
{
     [key0] => 'Text1'
     [key2] => 'Text2'
     [key4] => 'Text3'
     [key5] => 'Text4'
            ...
     [keyn] => 'Text5'
}

Array2()
{
     [key0] => 'Text1'
     [key1] => 'Text2'
     [key2] => 'Text3'
     [key3] => 'Text4'
            ...
     [keyn] => 'Text5'
}
Некоторые ключи есть в обоих, некоторые есть только в одном из них.
Массивы и сами тексты очень большие, по 100кб каждый массив и сложение их:
PHP
1
$array3=$array1+$array2;
Довольно много времени занимает, плюс еще тут не только ключи но и данные участвуют.

Как создать массив состоящий только из ключей обоих массивов без повторений?

Добавлено через 12 минут
PHP
1
2
3
4
5
6
7
8
9
10
$keys=array();
foreach($array1 as $key=>$value)
{
    $keys[]=$key;
}
 
foreach($array2 as $key=>$value)
{
    if(!in_array($key,$keys)) $keys[]=$key;
}
Выполняется 0,5 сек

PHP
1
$array3=$array1+$array2;
Выполняется 0,25 сек

Но все равно долго.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2014, 17:54
Ответы с готовыми решениями:

Вывод значения ключей массива по условию совпадения других ключей
Есть массив $arElements Array ( => Array ( ...

Записать ассоциативный массив в файл с названиями ключей
всем привет, подскажите как записать например массив $_SERVER в файл построчно...

Массив, где в качестве ключей названия стран, а в качестве значений – массивы с городами
Обращение к опытным php программистам. Вывел в цикле значения массива: ...

Вывод ключей
Доброго времени суток. У меня есть плагин на wordpress, разширение woocommerce....

генератор ключей
как сделать код чтобы он генерировал рандомные ключи , чтобы получалось чтото...

14
Reebka
53 / 53 / 10
Регистрация: 25.09.2011
Сообщений: 264
25.03.2014, 17:57 2
Аппостол, http://www.php.net/manual/ru/function.array-merge.php
1
Voka
206 / 198 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
25.03.2014, 18:04  [ТС] 3
Работает по скорости как и сложение:
PHP
1
$array3=$array1+$array2;
0
Reebka
53 / 53 / 10
Регистрация: 25.09.2011
Сообщений: 264
25.03.2014, 18:22 4
PHP
1
2
3
4
5
6
7
8
9
10
11
12
$inArr = array(...); //входные массивы
$inArr2 = array(..); 
 
foreach($inArr2 as $k => $v){
  if(isset($inArr[$k])){
    $innArr[$k] = $v; //типа если в первом массиве ключ существует. Я заменил на значение второго массива. Делай как нужно тебе
  }else{
    $innArr[$k] = $v; //если ключ в первом массиве не существует
  }
}
 
//на выходе в $innArr будет объединённый массив
Код в теле цикла можно ужать до одной строки в зависимости от логики работы с повторяющимися ключами. Глянь, как это работает.

Добавлено через 2 минуты
Или я всё же неправильно понял и нужно получить массив, который состоял бы ТОЛЬКО из ключей, которые есть в обоих массивах?
1
V@D!k
249 / 249 / 98
Регистрация: 26.07.2010
Сообщений: 1,685
25.03.2014, 18:32 5
PHP
1
$keys=array_merge(array_keys($array1),array_keys($array2)));
1
Voka
206 / 198 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
25.03.2014, 18:38  [ТС] 6
PHP
1
$keys=array_merge(array_keys($array1),array_keys($array2));
0,25 сек
PHP
1
2
3
4
5
6
7
8
9
10
$inArr = array(...); //входные массивы
$inArr2 = array(..); 
 
foreach($inArr2 as $k => $v){
  if(isset($inArr[$k])){
    $innArr[$k] = $v; //типа если в первом массиве ключ существует. Я заменил на значение второго массива. Делай как нужно тебе
  }else{
    $innArr[$k] = $v; //если ключ в первом массиве не существует
  }
}
0,25

Да нужен массив ТОЛЬКО из ключей обоих массивов
0
V@D!k
25.03.2014, 18:38
  #7

Не по теме:

так какой же в итоге самый быстрый?:)
p.s. не заметил предыдущего сообщения

0
Voka
206 / 198 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
25.03.2014, 18:40  [ТС] 8
все которые по 0,25 колеблются от 0,22 до 0,26
Надо еще сами функции посмотреть как работают, тогда уже можно будет вердикт выносить =)
0
V@D!k
25.03.2014, 18:42
  #9

Не по теме:

напишите пожалуйста потом результат, самому интересно узнать:)

0
Reebka
53 / 53 / 10
Регистрация: 25.09.2011
Сообщений: 264
25.03.2014, 18:45 10
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$inArr = array(...); //входные массивы
$inArr2 = array(..); 
 
$outArr = array();
 
foreach($inArr as $k => $v){
  if(isset($inArr2[$k])){
    $outArr[] = $k;
  }
}
 
foreach($inArr2 as $k => $v){
  if(isset($inArr[$k])){
    $outArr[] = $k;
  }
}
Добавлено через 44 секунды
Крутится в голове что-то более оптимальное, а понять не могу.
1
Voka
206 / 198 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
25.03.2014, 18:51  [ТС] 11
уже в шапке делал так:
PHP
1
2
3
4
5
6
7
8
9
10
$keys=array();
foreach($array1 as $key=>$value)
{
    $keys[]=$key;
}
 
foreach($array2 as $key=>$value)
{
    if(!in_array($key,$keys)) $keys[]=$key;
}
0,5сек

Первый цикл можно и без if(isset()) сделать, т.к. массив ключей пуст сначала
0
Reebka
53 / 53 / 10
Регистрация: 25.09.2011
Сообщений: 264
25.03.2014, 18:59 12
Цитата Сообщение от Аппостол Посмотреть сообщение
Первый цикл можно и без if(isset()) сделать, т.к. массив ключей пуст сначала
Массив ключей там и не проверяется. Это что-то вроде "если такой ключ существует в первом и во втором массиве". У тебя в коде сначала добавляются все ключи первого массива, даже если они не существуют во втором. Если так и нужно, то тогда пардоньте, неверно понял. Тем более in_array может работать дольше простого isset (и наверняка так и есть)

Добавлено через 2 минуты
Ну проверь, ну пожалуйста, ну будь другом
1
Voka
206 / 198 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
25.03.2014, 19:03  [ТС] 13
да, с isset быстрее:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$inArr = array(...); //входные массивы
$inArr2 = array(..); 
 
$outArr = array();
 
foreach($inArr as $k => $v){
    $outArr[] = $k;
}
 
foreach($inArr2 as $k => $v){
  if(isset($inArr[$k])){
    $outArr[] = $k;
  }
}
0,23 сек


Скачал исходники php, сейчас буду изучать функции:
array_merge
array_keys
0
Reebka
53 / 53 / 10
Регистрация: 25.09.2011
Сообщений: 264
25.03.2014, 19:07 14
а php версии, кстати, какой у тебя?
1
Voka
206 / 198 / 110
Регистрация: 27.12.2010
Сообщений: 819
Записей в блоге: 1
25.03.2014, 19:14  [ТС] 15
Сейчас в openserver тестирую, стоит 5.3.27, на сервере в интернете 5.3.10

Добавлено через 4 минуты
array_keys
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
36
37
38
39
40
41
42
43
44
45
PHP_FUNCTION(array_keys)
{
    zval *input,                /* Input array */
         *search_value = NULL,  /* Value to search for */
         **entry,               /* An entry in the input array */
           res,                 /* Result of comparison */
          *new_val;             /* New value */
    int    add_key;             /* Flag to indicate whether a key should be added */
    zend_bool strict = 0;       /* do strict comparison */
    HashPosition pos;
    int (*is_equal_func)(zval *, zval *, zval * TSRMLS_DC) = is_equal_function;
 
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|zb", &input, &search_value, &strict) == FAILURE) {
        return;
    }
 
    if (strict) {
        is_equal_func = is_identical_function;
    }
 
    /* Initialize return array */
    if (search_value != NULL) {
        array_init(return_value);
    } else {
        array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL_P(input)));
    }
    add_key = 1;
 
    /* Go through input array and add keys to the return array */
    zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &pos);
    while (zend_hash_get_current_data_ex(Z_ARRVAL_P(input), (void **)&entry, &pos) == SUCCESS) {
        if (search_value != NULL) {
            is_equal_func(&res, search_value, *entry TSRMLS_CC);
            add_key = zval_is_true(&res);
        }
 
        if (add_key) {
            MAKE_STD_ZVAL(new_val);
            zend_hash_get_current_key_zval_ex(Z_ARRVAL_P(input), new_val, &pos);
            zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &new_val, sizeof(zval *), NULL);
        }
 
        zend_hash_move_forward_ex(Z_ARRVAL_P(input), &pos);
    }
}

array_merge
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
36
37
38
39
40
41
42
PHP_FUNCTION(array_merge)
{
    php_array_merge_or_replace_wrapper(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0, 0);
}
 
static void php_array_merge_or_replace_wrapper(INTERNAL_FUNCTION_PARAMETERS, int recursive, int replace) /* {{{ */
{
    zval ***args = NULL;
    int argc, i, init_size = 0;
 
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &argc) == FAILURE) {
        return;
    }
 
    for (i = 0; i < argc; i++) {
        if (Z_TYPE_PP(args[i]) != IS_ARRAY) {
            php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1);
            efree(args);
            RETURN_NULL();
        } else {
            int num = zend_hash_num_elements(Z_ARRVAL_PP(args[i]));
 
            if (num > init_size) {
                init_size = num;
            }
        }
    }
 
    array_init_size(return_value, init_size);
 
    for (i = 0; i < argc; i++) {
        if (!replace) {
            php_array_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_PP(args[i]), recursive TSRMLS_CC);
        } else if (recursive && i > 0) { /* First array will be copied directly instead */
            php_array_replace_recursive(Z_ARRVAL_P(return_value), Z_ARRVAL_PP(args[i]) TSRMLS_CC);
        } else {
            zend_hash_merge(Z_ARRVAL_P(return_value), Z_ARRVAL_PP(args[i]), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *), 1);
        }
    }
 
    efree(args);
}
0
25.03.2014, 19:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2014, 19:14

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

usort и сохранение ключей
Здравствуйте! В общем юзаю разреженный 2-у мерный массив. Надо отсортировать...

Подсветка ключей в тексте
Здравствуйте уважаемые знатоки. Появилась такая идея. Написать программу, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru