Что такое код array_flip


array_flip

array_flip — Меняет местами ключи с их значениями в массиве

Описание

Функция array_flip() возвращает array наоборот, то есть ключи массива trans становятся значениями, а значения массива trans становятся ключами.

Обратите внимание, что значения массива trans должны быть корректными ключами, то есть они должны иметь тип integer или string . Если значение имеет неверный тип, будет выдано предупреждение и данная пара ключ/значение не будет обработана.

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

Список параметров

An array of key/value pairs to be flipped.

Возвращаемые значения

Returns the flipped array on success and NULL on failure.

Примеры

Пример #1 Пример использования array_flip()

Пример #2 Пример использования array_flip() с коллизиями

Что такое код array_flip

2134 просмотра

3 ответа

40158 Репутация автора

Есть ли способ избежать использования array_flip для оптимизации производительности. Я делаю select заявление из базы данных, подготовка запроса и его выполнения и хранения данных в виде ассоциативного массива в $resultCollection и чем я массив op и для каждого элемента в $resultCollection храню его outputId в op[] как это видно из кода.

Я объяснил код, и поэтому мой вопрос заключается в том, как я могу добиться аналогичной альтернативы для array_flip с использованием array_flip, поскольку я хочу повысить производительность.

Ответы (3)

плюса

95327 Репутация автора

Ну, поскольку это не похоже на то, что вы заботитесь о значении, а только о скорости поиска ключей O (1), я бы построил $op этот способ в первый раз

Или вы можете посмотреть in_array() , я не знаю, как его скорость сравнивается. (Похоже, это 0 (n), поэтому не быстрее)

РЕДАКТИРОВАТЬ

Если вы хотите создать в первый раз вокруг того , что вы были получать после того, как array_flip() , сделать это таким образом.

Но после ваших комментариев я все еще не уверен, действительно ли я «понял», что вы ищете.

3 плюса

29276 Репутация автора

Вы должны быть в состоянии использовать ключ из foreach для индексов и строить предварительно перевернутый массив следующим образом.

плюса

964 Репутация автора

Я добавляю этот ответ, потому что вы упомянули в заголовке «Улучшение производительности». Вы должны продолжить с array_flip() . С точки зрения производительности по сравнению с foreach циклом, как уже упоминалось, он работает намного быстрее, особенно на больших массивах (возможно, из-за его собственной природы). Производительность почти можно игнорировать в небольших массивах, но победитель есть array_flip() . Всегда.

Результат того, что я тестировал:

Видеть, что? array_flip() становится все быстрее, делая массив больше и больше. Таким образом, на данный момент его использование является лучшим выбором (в будущем JIT может помочь foreach работать быстрее).

array_flip

array_flip — меняет местами ключи и значения массива.

Описание

array array_flip (array trans)

array_flip() возвращает array в перевёрнутом/flip порядке, т.е. ключи из trans становятся значениями, а значения из trans становятся ключами.

Заметьте, что значения trans должны быть правильными ключами, т.е. они должны быть integer или string. Будет выдано предупреждение, если значение имеет неправильный тип, и тогда пара ключ/значение в запросе не будет перевёрнута.

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

array_flip() возвращает FALSE при неудаче.

array_unique vs array_flip

Если у меня был массив целых чисел со знаком, например:

Чтобы получить уникальные значения, я бы инстинктивно использовал array_unique , но после рассмотрения я мог выполнить array_flip дважды, что будет иметь тот же эффект, и я думаю, что это будет быстрее?

array_unique O (n log n) из-за операции сортировки, которую он использует

array_flip O (n)

Правильно ли я в своих предположениях?

4 ответа

Я сравнил его для вас: CodePad

Ваша интуиция была правильной!

Обратите внимание, что array_keys(array_flip($array)) будет давать новые ключевые значения в порядке, что во многих случаях может быть тем, что вы хотите (идентично, но намного быстрее, чем array_values(array_unique($array)) ), тогда как array_flip(array_flip($array)) идентично (за исключением намного быстрее) до array_unique($array) , где ключи остаются неизменными.

Внимание: этот метод НЕ является заменой для array_unique(). Он работает только для массивов со значениями, которые являются действительными ключами. (например: string, integer, вещи могут быть перенесены в int). И, конечно, не работает для массивов объектов.

array_flip — Меняет местами ключи с их значениями в массиве

(PHP 4, PHP 5, PHP 7)

array_flip — Меняет местами ключи с их значениями в массиве

Илон Маск рекомендует:  Что такое код gmp_or

Описание

Функция array_flip() возвращает array наоборот, то есть ключи массива array становятся значениями, а значения массива array становятся ключами.

Обратите внимание, что значения массива array должны быть корректными ключами, то есть они должны иметь тип integer или string . Если значение имеет неверный тип, будет выдано предупреждение и данная пара ключ/значение не будет включена в результат.

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

Список параметров

Массив переворачиваемых пар ключ/значение.

Возвращаемые значения

Возвращает перевернутый массив в случае успеха, или NULL в случае ошибки.

Примеры

Пример #1 Пример использования array_flip()

= array( «oranges» , «apples» , «pears» );
$flipped = array_flip ( $input );

Результат выполнения данного примера:

Пример #2 Пример использования array_flip() с коллизиями

= array( «a» => 1 , «b» => 1 , «c» => 2 );
$flipped = array_flip ( $input );

Результат выполнения данного примера:

Смотрите также

  • array_values() — Выбирает все значения массива
  • array_keys() — Возвращает все или некоторое подмножество ключей массива
  • array_reverse() — Возвращает массив с элементами в обратном порядке

основы PHP замена ключей с помощью array_flip

Коллеги программисты, добрый день нужна Ваша помощь.

Обработчик строк strtr заменяет ключи на их значение, а наоборот осуществляется при помощи array_flip, но у меня не выходит подскажите как с помощью array_flip обратно поменять местами значение на их ключи?

Оригинал: (нас предали явка провалена.) Шифровка: (12с 35ед24и явк2 35ов24е12.)

WARNING array_flip() expects parameter 1 to be array, string given on line number 18 Расшифровка: ()

Используйте поиск по хешу, а не обыск массива

Обыск массива

Обычно проверка происходит так:

Такой способ решает задачу, но он не самый эффективный. Проходим по массиву слов в сообщении и проверяем каждое на нахождение в списке запрещённых функцией in_array() . В PHP, алгоритм, по которому реализована работа функции in_array() , имеет линейную сложность — O(n). Это значит, что с увеличением списка плохих слов, время работы будет расти пропорционально. Мы можем придумать что-нибудь получше.

Поиск по хешу

Так как список плохих слов заранее известен, можно переработать способ сравнения так, что он будет иметь константную сложность, не зависящую от количества запрещённых слов в списке. Для этого можно использовать ассоциативные массивы. Как и в случае с хеш-таблицами, скорость поиска ключа в массиве равна O(1), за исключением некоторых случаев, которые в нашей ситуации не возникнут.

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

Тест производительности

Давайте попробуем протестировать новый способ. Я написал простой тест, который покажет затраченное время на одном и том же наборе данных для способов: «обыск массива» и «поиск по хешу».

Как видно из листинга, в тесте используется 10 000 повторов. Результат получился таким:

Как видно, поиск по хешу дал прирост в 480% по сравнению с обыском массива.

Важно понимать, что с ростом количества запрещённых слов, увеличивается время, необходимое для обыска массива функцией in_array() . А вот isset() от количества элементов не зависит, и время его работы останется постоянным. Давайте, я покажу, что имел ввиду. В следующем примере список запрещённых слов будет состоять из 10 000 элементов.

Разница в скорости видна намного лучше. Поиск по хешу на 3 162 процента быстрее обыска массива.

Вообще, тут ничего нового нет

Это не новая идея. Это довольно-таки распространённый подход во многих языках. Я недавно понял вдруг, что постоянно использую для подобных задач поиск по хэшу, пока читал книгу «Программирование на Lua».

В следующий раз, когда будете использовать in_array() для проверки, задумайтесь, а не ускорится ли работа, если вместо этого использовать функцию isset() на ключах ассоциативного массива.

Что такое код array_flip

2134 просмотра

3 ответа

40158 Репутация автора

Есть ли способ избежать использования array_flip для оптимизации производительности. Я делаю select заявление из базы данных, подготовка запроса и его выполнения и хранения данных в виде ассоциативного массива в $resultCollection и чем я массив op и для каждого элемента в $resultCollection храню его outputId в op[] как это видно из кода.

Я объяснил код, и поэтому мой вопрос заключается в том, как я могу добиться аналогичной альтернативы для array_flip с использованием array_flip, поскольку я хочу повысить производительность.

Ответы (3)

плюса

95327 Репутация автора

Ну, поскольку это не похоже на то, что вы заботитесь о значении, а только о скорости поиска ключей O (1), я бы построил $op этот способ в первый раз

Или вы можете посмотреть in_array() , я не знаю, как его скорость сравнивается. (Похоже, это 0 (n), поэтому не быстрее)

РЕДАКТИРОВАТЬ

Если вы хотите создать в первый раз вокруг того , что вы были получать после того, как array_flip() , сделать это таким образом.

Но после ваших комментариев я все еще не уверен, действительно ли я «понял», что вы ищете.

3 плюса

29276 Репутация автора

Вы должны быть в состоянии использовать ключ из foreach для индексов и строить предварительно перевернутый массив следующим образом.

Илон Маск рекомендует:  Что такое код getallheaders

плюса

964 Репутация автора

Я добавляю этот ответ, потому что вы упомянули в заголовке «Улучшение производительности». Вы должны продолжить с array_flip() . С точки зрения производительности по сравнению с foreach циклом, как уже упоминалось, он работает намного быстрее, особенно на больших массивах (возможно, из-за его собственной природы). Производительность почти можно игнорировать в небольших массивах, но победитель есть array_flip() . Всегда.

Результат того, что я тестировал:

Видеть, что? array_flip() становится все быстрее, делая массив больше и больше. Таким образом, на данный момент его использование является лучшим выбором (в будущем JIT может помочь foreach работать быстрее).

Array_flip

Php функции


Php скрипты


array_flip

array_flip — Поменять местами значения массива

Описание

array array_flip ( array input )

Функция array_flip() возвращает array в обратном порядке, то есть ключи массива исходный_массив становятся значениями, а значения массива исходный_массив становятся ключами.

Обратите внимание, что значения массива исходный_массив должны быть корректными ключами, то есть они должны иметь тип integer или string. Если значение имеет неверный тип, будет выдано предупреждение и пара ключ/значение не будет обработана .

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

Функция array_flip() возвращает FALSE, если обработка массива вызвала ошибку.

Пример 1. Пример использования array_flip()

$trans = array_flip ( $trans );
$original = strtr ( $str , $trans );

Пример 2. Пример использования array_flip(): многократное повторение значения

$trans = array («a» => 1, «b» => 1, «c» => 2);
$trans = array_flip ( $trans );
print_r ( $trans );

теперь $trans содержит:

Array ( [ 1 ] => b [ 2 ] => c )

User Contributed Notes

mikeb at tracersinfo dot com
07-Feb-2006 01:42

Further deriving on benles -> crescentfreshpot, I think the following restatement of array_invert() reads much easier and probably runs faster, too. It does yield the same results:

function array_invert( $a rr ) <
$fl ipped = array ();
foreach ( $a rr as $k => $a ) <
# put the value in the key, with a throw-away value. dups are inherently avoided,
# though overwritten. not sure if prefixing with if ( !isset ( $fl ipped [ $a ] [ $k ] ) )
# would speed this up or slow it down. probably depends on quantity of dups.
$fl ipped [ $a ] [ $k ] = NULL;
>
foreach ( $fl ipped as $k => $fl ) <
# now make the keys the values.
$fl ipped [ $k ] = array_keys ( $fl );
>
return $fl ipped ;
>
crescentfreshpot at yahoo dot com
04-Jul-2005 03:21

Furthering benles note, if you don’t want duplicate values to overwrite existing keys but need non-duplicate values to be assigned like array_flip , use:

function array_invert ( $a rr )
<
$fl ipped = array ();
foreach ( array_keys ( $a rr ) as $k ey ) <
if ( array_key_exists ( $a rr [ $k ey ] , $fl ipped )) <
$fl ipped [ $a rr [ $k ey ] ] = array_merge (( array ) $fl ipped [ $a rr [ $k ey ] ] , ( array ) $k ey );
> else <
$fl ipped [ $a rr [ $k ey ] ] = $k ey ;
>
>
return $fl ipped ;
>

$a = array (
‘orange’ => ‘fruit’ ,
‘milk’ => ‘dairy’ ,
‘apple’ => ‘fruit’ ,
‘banana’ => ‘fruit’
);

print_r ( array_invert ( $a ));

/*
Output:
Array
(
[ fruit ] => Array
(
[ 0 ] => orange
[ 1 ] => apple
[ 2 ] => banana
)

[ dairy ] => milk
)
*/
?>

benles at bldigital dot com
06-Mar-2005 04:52

In case anyone wants a function that doesn’t lose duplicates:

function array_invert( $a rr )
<
$res = Array ();
foreach (array_keys( $a rr ) as $k ey )
<
if ( !array_key_exists ( $a rr [ $k ey ] , $res )) $res [ $a rr [ $k ey ] ] = Array ();
array_push ( $res [ $a rr [ $k ey ] ] , $k ey );
>
return $res ;
>
snaury at narod dot ru
23-Nov-2004 10:21

When you do array_flip , it takes the last key accurence for each value, but be aware that keys order in flipped array will be in the order, values were first seen in original array. For example, array :

[ 1 ] => 1
[ 2 ] => 2
[ 3 ] => 3
[ 4 ] => 3
[ 5 ] => 2
[ 6 ] => 1
[ 7 ] => 1
[ 8 ] => 3
[ 9 ] => 3

After flipping will become:
(first seen value -> first key)

[ 1 ] => 7
[ 2 ] => 5
[ 3 ] => 9

And not anything like this:
(last seen value -> last key)

[ 2 ] => 5
[ 1 ] => 7
[ 3 ] => 9

In my application I needed to find five most recently commented entries. I had a sorted comment-id => entry- >array , and what popped in my mind is just do array_flip ( $a rr ay ), and I thought I now would have last five entries in the array as most recently commented entry => comment pairs. In fact it wasn’t (see above, as it is the order of values used). To achieve what I need I came up with the following (in case someone will need to do something like that):

First, we need a way to flip an array , taking the first encountered key for each of values in array. You can do it with:

$a rr ay = array_flip (array_unique( $a rr ay ));

Well, and to achieve that «last comments» effect, just do:

$a rr ay = array_reverse ( $a rr ay , true);
$a rr ay = array_flip (array_unique( $a rr ay ));
$a rr ay = array_reverse ( $a rr ay , true);

In the example from the very beginning array will become:

[ 2 ] => 5
[ 1 ] => 7
[ 3 ] => 9

Just what I (and maybe you?) need. =ˆ_ˆ=
znailz at yahoo dot com
06-Aug-2003 01:42

I know a lot of people want a function to remove a key by value from an array. I saw solutions that iterate(!) though the whole array comparing value by value and then unsetting that value’s key. PHP has a built-in function for pretty much everything (heard it will even cook you breakfast), so if you think «wouldn’t it be cool if PHP had a function to do that. «, odds are it already has. Check out this example. It takes a value, gets all keys for that value if it has duplicates, unsets them all, and returns a reindexed array.

$a rr = array ( 11 , 12 , 13 , 12 ); // sample array
$a rr = array_flip ( $a rr );
unset ( $a rr [ 12 ] );
$a rr = array ( array_keys ( $a rr ));
?>
Array
(
[ 0 ] => Array
(
[ 0 ] => 11
[ 1 ] => 13
)
?>

)
rgonzalez at kidchile dot cl
06-Mar-2003 10:58

If you need traspose an array (i.e convert columns in rows) for a mult >array obtain from a SQL query, try this:

That is an array from arrays that represent each columns.

$a rr eglo _aux = Array ();
foreach ( $a rr eglo as $k ey master => $value )
foreach ( $value as $k ey => $elemento )
$a rr eglo _aux [ $k ey ] [ $k ey master ] = $elemento ;
?>

the results will be

Bye.
Rodrigo Gonzбlez M. — CHILE

drupal render (8)

Недавно я перенес свой модуль на Drupal7 (на PHP версии 5.3.1), и теперь у меня возникают следующие ошибки:

Я также попробовал обновить другие модули и ядра до последних версий, как упоминалось здесь http://drupal.org/node/1022736

Объект 7.x-1.x-dev (2011-янв-24), просмотры 7.x-3.x-dev (2011-янв-22), Drupal core 7.x-dev (2011-янв-24) , profile2 7.x-1.0-beta1, ссылки 7.x-2.x-dev (2011-янв-14), ctools 7.x-1.0-alpha2

Я не могу понять, что именно вызывает эту ошибку?

Редактировать:

array_flip () возвращает массив в флип-порядке, то есть ключи от trans становятся значениями и значениями из ключей trans становятся.

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

Я сделал var_dump($ids); перед строкой 178 в entity.inc ( $passed_ > )

И мне кажется, что пара ключ / значение всегда в правильном формате (?).

Я столкнулся с той же ошибкой array_flip в выходные, пытаясь обновить пользовательский модуль до Drupal 7. Проблема в том, что вложенный массив передается в DrupalDefaultEntityController, но он ожидает простой массив целых чисел или строк. В моем случае я передавал вложенный массив в EntityFieldQuery, когда ему нужен только массив целых чисел.

Чтобы лучше отслеживать код, вызывающий DrupalDefaultEntityController, попробуйте вставить следующее в строку 178 в entity.inc:

. или предпочтительно установите модуль Devel и попробуйте вместо этого вставить следующее:

Проблема возникает, когда вы используете доступ к полям органических групп (Organic Groups 7.x-1.3)

Обычно вы можете отключить этот подмодуль, если только вы не контролируете контроль уровня на уровне OG.

Пример хорошего использования:

Это может быть проблема плохого кодирования (например, загрузка недопустимых объектов или запуск старого кода Drupal 6 в Drupal 7):

  • Если у вас есть какие-либо пользовательские модули, дважды проверьте свой код на распространенную ошибку
    • Недопустимое использование entity_load() ,
    • Передача массива загруженных объектов в entity_load (),
    • Проверьте API-интерфейс Entity и примерный модуль, который обеспечивает правильный способ использования Entities в Drupal 7.
  • Если вы используете модуль Contrib, найдите правильную ошибку и примените исправление (если доступно) или поднимите новый.
  • Вы можете попытаться сбросить обратную трассировку, вызвав и распечатав print_r(debug_backtrace()) ,
  • Используйте инструмент scm, чтобы вернуться к тому, где он работает, и сравните изменения, поэтому в конечном итоге вы обнаружите, где проблема (например, gitk , git log —patch и т. Д.).
  • используйте модуль Coder Review, чтобы найти ошибки в вашем коде после обновления (например, drush —contrib —no-empty —upgrade7x coder-review ).
  • Установите XDebug для отслеживания вашей проблемы с помощью журнала трассировки или пошаговой отладки.

В качестве альтернативы вы можете отлаживать свой код, определяя следующий временный крючок:

Перед тестированием очистите кеш.

Он будет печатать обратную линию при каждом предупреждении или ошибке PHP с аргументами, поэтому вы можете найти свои недопустимые параметры, которые были переданы в ядро ​​Drupal.

Используете ли вы модуль Insert? См. http://drupal.org/node/850946 .

Когда дело доходит до конкретных ошибок, подобных этому, я думаю, что вам лучше искать очередь ошибок на drupal.org, чем спрашивать о SO.

Вот простое решение :)

Измените файл settings.php и добавьте эту строку

Увидел аналогичную проблему в нашем использовании последнего модуля page_title. Пока что мы просто отключили модуль, и он очистил ошибку.

Илон Маск рекомендует:  Выбираем веб-камеру для домашнего компьютера
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL