Browse Source

Zend_Search_Lucene: resolves PHP 5.3 related array_multisort() usage problem. Fixes ZF-8347, ZF-8878 and part of ZF-8809 issues.

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@20438 44c647ce-9c0f-0410-b52a-842ac1e357ba
alexander 16 years ago
parent
commit
f4a72e2e94
1 changed files with 21 additions and 13 deletions
  1. 21 13
      library/Zend/Search/Lucene.php

+ 21 - 13
library/Zend/Search/Lucene.php

@@ -979,6 +979,8 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface
             $sortAsc    = SORT_ASC;
             $sortNum    = SORT_NUMERIC;
 
+            $sortFieldValues = array();
+
             require_once 'Zend/Search/Lucene/Exception.php';
             for ($count = 1; $count < count($argList); $count++) {
                 $fieldName = $argList[$count];
@@ -988,29 +990,35 @@ class Zend_Search_Lucene implements Zend_Search_Lucene_Interface
                 }
 
                 if (strtolower($fieldName) == 'score') {
-                    $sortArgs[] = $scores;
+                    $sortArgs[] = &$scores;
                 } else {
                     if (!in_array($fieldName, $fieldNames)) {
                         throw new Zend_Search_Lucene_Exception('Wrong field name.');
                     }
 
-                    $valuesArray = array();
-                    foreach ($hits as $hit) {
-                        try {
-                            $value = $hit->getDocument()->getFieldValue($fieldName);
-                        } catch (Zend_Search_Lucene_Exception $e) {
-                            if (strpos($e->getMessage(), 'not found') === false) {
-                                throw new Zend_Search_Lucene_Exception($e->getMessage(), $e->getCode(), $e);
-                            } else {
-                                $value = null;
+                    if (!isset($sortFieldValues[$fieldName])) {
+                        $valuesArray = array();
+                        foreach ($hits as $hit) {
+                            try {
+                                $value = $hit->getDocument()->getFieldValue($fieldName);
+                            } catch (Zend_Search_Lucene_Exception $e) {
+                                if (strpos($e->getMessage(), 'not found') === false) {
+                                    throw new Zend_Search_Lucene_Exception($e->getMessage(), $e->getCode(), $e);
+                                } else {
+                                    $value = null;
+                                }
                             }
+
+                            $valuesArray[] = $value;
                         }
 
-                        $valuesArray[] = $value;
+                        // Collect loaded values in $sortFieldValues
+                        // Required for PHP 5.3 which translates references into values when source
+                        // variable is destroyed
+                        $sortFieldValues[$fieldName] = $valuesArray;
                     }
 
-                    $sortArgs[] = &$valuesArray;
-                    unset($valuesArray);
+                    $sortArgs[] = &$sortFieldValues[$fieldName];
                 }
 
                 if ($count + 1 < count($argList)  &&  is_integer($argList[$count+1])) {