2015-04-25 4 views
0

Я искал ответ на этот вопрос, который у меня есть с массивом, но пока нет ответа здесь и в Интернете.PHP-массив, переданный по ссылке?

У нас есть сайт TYPO3 с индексированным поиском, настроенным и установленным. Мы сканируем записи (~ 60000) с помощью расширения искателя. Все было настроено и работает нормально, но мы видели, что некоторые записи не показывались в результатах поиска.

Я отлаживал код TYPO3 и обнаружил, что некоторые слова не были связаны с его записями в таблице index_rel.

То, что я нашел, заключается в том, что, когда код запуска входит в метод indexTypo3PageContent() в строке 573, метод checkWordList() вызывается с массивом слов, переданных в качестве аргумента. Внутри метода отсутствует значение некоторых значений массива. Это где-то неправильно, потому что, если я прав, массив передается по значению, однако массив вне метода checkWordList() изменен, слова меньше. Поэтому некоторые слова не будут обратно проиндексированы в свою запись.

Я могу изменить код. Это очень просто. Однако я хочу понять проблему. Это ошибка PHP? Не передаются ли массивы PHP по значению? Я использую PHP 5.5 на Ubuntu.

Если кто-то может дать намек на то, что происходит, я буду очень признателен.

В любом случае, я отправляю сообщение об ошибке TYPO3.

Bests,

Б.

+1

Это был дан ответ здесь уже http://stackoverflow.com/questions/2030906/are-arrays-in-php-passed-by-value-or-by-reference –

+0

Рохит спасибо вы очень за ваш ответ. Думаю, тогда я нашел ошибку в PHP, потому что согласно ответам на этой странице массив передается по значению, когда он изменяется внутри функции. Однако что-то должно происходить, когда PHP анализирует файл, указанный в моем вопросе. Может быть, это потому, что unset находится внутри структур управления. Я пробовал код, как это до публикации: ' '5']; x ($ a); print_r ($ a); ?> ' Он работает, как и ожидалось. В этом файле нет. –

+0

Где вы проверили массив снаружи? Метод 'checkWordList' предназначен только для вставки слов в отдельную таблицу, на которую ссылается таблица индексов. Поскольку параметры не передаются по ссылке, нет никаких шансов на изменение, о котором вы говорили. Я не могу воспроизвести проблему, которую вы описываете. – Michael

ответ

0

Массивы передаются по значению, действительно (или как некоторые из них указывали в качестве ссылки, если они не изменяются в функции или метода, см комментарий Рохит выше).

Я думал, что массивы были разными, но не были. Это была просто усталость. Отладка в поздние часы неэффективна.

Во всяком случае, я нашел проблему после копания большего количества кода. Я использую TYPO3 4 LTS версию indexed_search.

Метод indexAnalyze индексатора вызывает два других метода: анализHeaderInfo и анализBody. Оба метода почти идентичны, за исключением того, что analysisHeaderInfo не устанавливает сначала (первое вхождение), которое фактически является индексом массива. Затем в методе submitWords, когда запрос выполняется с неустановленным сначала, MySQL жалуется, что сначала имеет значение NULL. Поэтому вставка не производится. Это происходит не по новой версии из-за очистки кода. Как можно видеть в предоставленной ссылке на код, существует тип cast to int, поэтому, если он не задан, он будет равен нулю, а не null. Можно было бы обсуждать семантику всех метаданных, имеющих первое вхождение, равное нулю, но это еще одна история.

Надеюсь, это поможет кому-то использовать и старый indexed_search TYPO3. ;-)