2010-03-26 2 views
1

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

$valsArray = array(); 

//I process each value from a file (code removed for simplicity) 
//and then add into the array 
$valsArray[] = $val; 

Как превратить это в ассоциативном массиве вместо где значение приобретает вставлен (как $key of associative array), только если он не существует. Если он существует, увеличивайте его счетчик ($value of associative array) на 1. Я пытаюсь найти более эффективный способ обработки этих значений по сравнению с тем, что я делаю сейчас.

+0

Почему вы не используете для этого массив-ассоциированный элемент? – user187291

ответ

3

Как вы цикл через ваши ценности вы можете сделать следующее:

isset($valsArray[$val]) ? $valsArray[$val]++ : $valsArray[$val]=1; 

пример:

$valsArray=array(); 

$val="foo"; 
isset($valsArray[$val])?$valsArray[$val]++:$valsArray[$val]=1; 
$val="foo"; 
isset($valsArray[$val])?$valsArray[$val]++:$valsArray[$val]=1; 
$val="bar"; 
isset($valsArray[$val])?$valsArray[$val]++:$valsArray[$val]=1; 

print_r($valsArray); 

поможет вам:

Array ([foo] => 2 [bar] => 1) 
1

Не можете ли вы просто $valsArray = array_unique($valsArray);, когда вы закончите добавлять? Или вам нужно держать ключи в правильном порядке?

+0

Они не должны быть в правильном порядке, так что это один из способов. Но если я так делаю, я теряю информацию об их подсчете (например, «оранжевый» ответил 5 раз, или «яблоко» было выбрано в качестве ответа 15 раз). С ассоциативным массивом можно хранить их счет как '$ value'' $ key' – karl

4
@$valsArray[$val]++; 

должен сделать это за вас. Новые записи добавляются как ключ со значением 1, существующие записи увеличивают свое значение. @ избегает запускать E_NOTICE каждый раз, когда это встречает новое значение.

+0

Будет генерировать ошибки уровня E_NOTICE, когда элемент еще не существует. – goat

+0

@chris К сожалению, это правда, хотя это очень хороший ответ и на первом месте перед зафом. Я думаю, что для будущих читателей с тем же вопросом я выберу ответ зафа, поскольку он более совершенен. – karl

+0

Ahh, я не понял, что это вызвало ошибку. Убирайся. Спасибо что подметил это. Я бы отредактировал что-то вроде zaf's, но он уже сделал это красиво, поэтому я оставлю свое в качестве примера более короткого, менее приятного способа сделать это. – Sparr

0

Попытка глядя на следующую документацию

http://www.php.net/manual/en/function.array-count-values.php

+0

@tombom, я не согласен. Ссылка на официальную документацию php, которая включает в себя отличное описание + пример использования. Длительное время дублирования долговременного ресурса не является хорошим временем использования. Если бы я связывался с каким-то случайным блоком имени ... тогда я мог бы согласиться. но в целом, гиперссылки на целенаправленную информацию довольно удивительны и очень подходят в качестве ответов здесь. – goat

+0

Вы правы, извините – fancyPants

Смежные вопросы