Я искал ответ на этот вопрос, который у меня есть с массивом, но пока нет ответа ни здесь, ни в Интернете.
У нас есть веб-сайт TYPO3, на котором настроен и установлен индексированный поиск. Мы сканируем записи (~ 60000), используя расширение сканера. Все было настроено и работает нормально, но мы увидели, что некоторые записи не появляются в результатах поиска.
Я отладил код TYPO3 и обнаружил, что некоторые слова не были связаны с его записями в таблице index_rel.
Я обнаружил, что когда в код входит метод indexTypo3PageContent () по линии 573 метод checkWordList () вызывается с массивом слов, переданных в качестве аргумента. Внутри метода есть неустановленные значения некоторых массивов. Вот где что-то не так, потому что, если я прав, массив передается по значению, однако массив вне метода checkWordList () изменяется, слов меньше. Поэтому некоторые слова не будут обратно проиндексированы в своей записи.
Я могу изменить код. Это очень просто. Однако я хочу понять проблему. Это ошибка PHP? Разве PHP-массивы не передаются по значению? Я использую PHP 5.5 на Ubuntu.
Если кто-нибудь может дать намек на то, что происходит, я буду очень признателен.
В любом случае, я публикую ошибку в системе ошибок TYPO3.
Bests,
B.
Массивы действительно передаются по значению (или, как некоторые указали по ссылке, если они не были изменены в функции или методе, см. Комментарий Rohit выше).
Я думал, что массивы были разные, но не были. Это была просто усталость. Отладка в поздние часы не является продуктивной.
Во всяком случае, я нашел проблему после того, как копался в коде. Я использую TYPO3 4 LTS версию indexed_search.
Метод indexAnalyze индексатора вызывает два других метода: analysisHeaderInfo и analyBody. Оба метода практически идентичны, за исключением того, что analysisHeaderInfo не устанавливает первым (первое вхождение), которое на самом деле является индексом массива. Тогда в методе submitWords, когда сначала выполняется запрос с неустановленным значением, MySQL жалуется, что сначала NULL. Поэтому вставка не производится. Это не происходит в более новой версии из-за очистки кода. Как видно из приведенной ссылки на код, есть тип, приведенный к типу int, поэтому, если first не установлен, он будет нулевым, а не нулевым. Можно все еще обсуждать семантику каждого метаданного с первым появлением, равным нулю, но это другая история.
Надеюсь, что это может помочь кому-то, использующему и старый indexed_search из TYPO3. 😉
Других решений пока нет …