Наиболее удобный способ преобразования неассоциативного массива в ассоциативный массив - PullRequest
0 голосов
/ 21 сентября 2011

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

Позвольте мне привести пример:

$test = array("foo", "bar", "faz");

Я хотел бы преобразовать это во что-то вроде:

$test = array("foo" => true, "bar" => true, "faz" => true);

Я знаю об этих методах, которые (почти) достигают того, что я хочу сделать, но я ищу что-тоболее изящный и элегантный, чем этот:

$new = array();
foreach ($test as $v) $new[$v] = true; // want to do it without a loop

$new = array_flip($test); // works for isset but array_values($new) are all different

$new = array_map(function() { return true; }, array_flip($test)); // would work but verbose

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 21 сентября 2011
$new = array_combine( $test, array_fill(0, count($test), true) );
1 голос
/ 21 сентября 2011

Как обычно, вам просто нужно задать вопрос, а затем вы сами найдете ответ: -)

С PHP 5.2 вы можете сделать это:

$new = array_fill_keys($test, true);

ниже этой версии вы можете использовать этот обходной путь:

$new = array_combine($test, array_fill(0, count($test), true));
0 голосов
/ 21 сентября 2011

хочу сделать это без цикла

Здесь кроется секретное знание: каждый раз, когда вы возитесь с массивом, задействуется цикл.Даже если ты этого не видишь.

работает для isset, но значения array_values ​​($ new) различны

и что?В чем проблема с этими различными значениями?

будет работать, но многословно

здесь идет еще один секретный материал: можно создать функцию.и скрыть столько кода внутри него, сколько они пожелают.

Честно говоря, вы получили ваш вопрос из ниоткуда.Разве у вас нет реальных проблем для решения?

Кстати, откуда вы взяли свой первоначальный массив?

0 голосов
/ 21 сентября 2011

Используйте array_combine вместе с array_fill

...