"PHP" / Говнокод #2900 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 nechin, (Updated )

Комментарии (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 продублируется, то в массиве будет последний вариант.
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8