Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
//возвращает массив без повторяющихся элементов (обязательно должен быть элемент [id])
function arrayUnique($arr)
{
$aResult = array();
$aIDs = array();
foreach($arr as $val)
if (!in_array($val['id'], $aIDs))
{
array_push($aIDs, $val['id']);
array_push($aResult, $val);
}
return $aResult;
}
На входе массив массивов.
Массивы равны, если все элементы одного массива равны элементам другого.
На выходе должен быть массив уникальных массивов.
По моему это попахивает.
function arrayUnique($arr)
{
$aResult = false; // если нету элементов, то вернуть false, а не array()
$aIDs = array();
if ($arr) // проверка наличия массива, иначе foreach дас error
foreach($arr as $val)
if ( ! $aIDs[ $val['id'] ] ) // убрать in_array, поиск по ключу
{
$aIDs[ $val['id'] ] = 1; // отмечаем id как заполненный
$aResult[] = $val; // добавление, как по мне, так удобнее
}
return $aResult;
}
Вопросик автору:
а что должно быть если в массиве есть повторения id,
ну т.е. в итоговом массиве какой из повторяющихся id должен быть?
т.к. в примере первый id всё равно попадёт в результирующий массив.
допустим id-шники такие: 1,2,3,4,1,2,1,2,3,6,7,8,9
что на выходе должно быть: 1,2,3,4,6,7,8,9 или же 4,6,7,8,9 ???
>>что на выходе должно быть: 1,2,3,4,6,7,8,9 или же 4,6,7,8,9 ???
Должно быть 1,2,3,4,6,7,8,9. Т.е. в массиве не должно быть одинаковых массивов (с одинаковым количеством элементов и равными значениями по ключу).
И не факт, что id будет уникален. Поэтому нужна проверка каждого элемента массива. Иначе мы удаляем неуникальные массивы.
if ($arr) - это лучше всетаки if(is_array($arr)) ибо там может быть тупо TRUE! ну или строка ...
if ( ! $aIDs[ $val['id'] ] ) - да и это тоже лучше юзать с isset ...
Да и вообще тему ты не понял .... по всей видимости ... В этой теме ВАЖНО чтобы не было ОДИНАКОВЫХ записей с каким либо ИД ... Видать Ид там не уникален если берется как пример из базы ... и не важно там на сколько отличается информация того и другого типа с одинаковым ИД, так что это В ЛЮБОМ случае гавнокод!
Предложенные вариант как раз и убирает все дублирующиеся id, в результат пойдёт только первый найденный.
У автора в алгоритме тоже именно так и работает.
А не проще ли изначально присваивать не как $arr[] = ...;
а как $arr[$id] = ...;
и проверять не надо. Если $id продублируется, то в массиве будет последний вариант.
Проверять нужно по всем элементам, а проверяется только по id.
или это по вашему не элемент?
нет прямого доказательства и прямого опровержения. гадать не следует.
не доказал.
[i]Вроде накалякал без опечаток[i]
а что должно быть если в массиве есть повторения id,
ну т.е. в итоговом массиве какой из повторяющихся id должен быть?
т.к. в примере первый id всё равно попадёт в результирующий массив.
допустим id-шники такие: 1,2,3,4,1,2,1,2,3,6,7,8,9
что на выходе должно быть: 1,2,3,4,6,7,8,9 или же 4,6,7,8,9 ???
Должно быть 1,2,3,4,6,7,8,9. Т.е. в массиве не должно быть одинаковых массивов (с одинаковым количеством элементов и равными значениями по ключу).
И не факт, что id будет уникален. Поэтому нужна проверка каждого элемента массива. Иначе мы удаляем неуникальные массивы.
В Вашем алгоритме тоже именно так и работает.
if ( ! $aIDs[ $val['id'] ] ) - да и это тоже лучше юзать с isset ...
Да и вообще тему ты не понял .... по всей видимости ... В этой теме ВАЖНО чтобы не было ОДИНАКОВЫХ записей с каким либо ИД ... Видать Ид там не уникален если берется как пример из базы ... и не важно там на сколько отличается информация того и другого типа с одинаковым ИД, так что это В ЛЮБОМ случае гавнокод!
У автора в алгоритме тоже именно так и работает.
а как $arr[$id] = ...;
и проверять не надо. Если $id продублируется, то в массиве будет последний вариант.