1. PHP / Говнокод #2900

    +159.4

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    //возвращает массив без повторяющихся элементов (обязательно должен быть элемент [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;
    	}

    На входе массив массивов.
    Массивы равны, если все элементы одного массива равны элементам другого.
    На выходе должен быть массив уникальных массивов.
    По моему это попахивает.

    Запостил: nechin, 31 Марта 2010

    Комментарии (14) RSS

    • с учетом существования array_unique очень попахивает, хотя тут все от задачи зависит и непонятно почему такие требования к id.
      Ответить
      • Массив вида
        Array
        (
            [0] => Array
                (
                    [id] => 376
                    [name] => n1
                    [param] => 
                )
            [1] => Array
                (
                    [id] => 516
                    [name] => n2
                    [param] => 123
                )
        )

        Проверять нужно по всем элементам, а проверяется только по id.
        Ответить
        • так id то у них разные
          или это по вашему не элемент?
          Ответить
          • А если id одинаковые, а остальные элементы разные? Массивы не уникальны, а в функции написано иначе. А если вообще не будет такого ключа?
            Ответить
            • А может $val - записи из таблицы и id - первичный ключ?
              Ответить
              • Даже если так, проверка на пустой массив и наличие такого ключа нужна.
                Ответить
            • а если id это хеш от остальных значений массива?

              нет прямого доказательства и прямого опровержения. гадать не следует.

              не доказал.
              Ответить
    • // Я бы делал это так:
      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;
      }

      [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 или же 4,6,7,8,9 ???
          Должно быть 1,2,3,4,6,7,8,9. Т.е. в массиве не должно быть одинаковых массивов (с одинаковым количеством элементов и равными значениями по ключу).
          И не факт, что id будет уникален. Поэтому нужна проверка каждого элемента массива. Иначе мы удаляем неуникальные массивы.
          Ответить
          • Предложенные вариант как раз и убирает все дублирующиеся id, в результат пойдёт только первый найденный.
            В Вашем алгоритме тоже именно так и работает.
            Ответить
      • if ($arr) - это лучше всетаки if(is_array($arr)) ибо там может быть тупо TRUE! ну или строка ...
        if ( ! $aIDs[ $val['id'] ] ) - да и это тоже лучше юзать с isset ...
        Да и вообще тему ты не понял .... по всей видимости ... В этой теме ВАЖНО чтобы не было ОДИНАКОВЫХ записей с каким либо ИД ... Видать Ид там не уникален если берется как пример из базы ... и не важно там на сколько отличается информация того и другого типа с одинаковым ИД, так что это В ЛЮБОМ случае гавнокод!
        Ответить
        • Предложенные вариант как раз и убирает все дублирующиеся id, в результат пойдёт только первый найденный.
          У автора в алгоритме тоже именно так и работает.
          Ответить
    • А не проще ли изначально присваивать не как $arr[] = ...;
      а как $arr[$id] = ...;
      и проверять не надо. Если $id продублируется, то в массиве будет последний вариант.
      Ответить

    Добавить комментарий