В чем разница? Массивы дуркуют.

talliar

Новичок
Всем здравствуйте!

Есть массив созданный в цикле:

PHP:
foreach ($tags as $one_tag){
if(stristr($one_tag, $tag) !== false){
$tags_array[] = $one_tag;
}
}

$result = array_unique($tags_array);
По сути тоже самое, что ручками его прописать $result = array ("dsd", "ddd, "fdf");

Этот массив дальше принимает javascript в формате json
PHP:
$json_data = array ('query'=>$tag,'suggestions'=>$result);
	echo json_encode($json_data);
Сразу же после получения данных в javascript стоит alert с полученными данными. И тут начинается самое увлекательное. Если массив получен в цикле, в алерте я получаю {"query":null,"suggestions":null}
Если массив прописываю ручками как тут: $result = array ("dsd", "ddd", "fdf");
То в алерте получаю {"query":null,"suggestions":["dsd","ddd","fdf"]}

При этом если просто обратиться к php скрипту напрямую, в обоих случаях я имею абсолютно одинаковые строчки:
{"query":"d","suggestions":["dsd","ddd","fdf"]}

Возможно кто-то знает в чем проблема? Где разница между массивом созданным в цикле и массивом набранным руками? При том, что при прямом обращении показывает абсолютно одинаковые строки. Может быть для JSON есть разница каким образом создан массив?

Заранее спасибо!
 

hell0w0rd

Продвинутый новичок
Покажите полностью ваш код. Хотябы ту часть, в которой объявлены все переменные и для json_encode всеравно каким образом создан массив. Вообще любой функции всеравно как создан массив, вообще плевать.
 

talliar

Новичок
Покажите полностью ваш код. Хотябы ту часть, в которой объявлены все переменные и для json_encode всеравно каким образом создан массив. Вообще любой функции всеравно как создан массив, вообще плевать.
Тут переменных немного: $tags - этот массив содержит результаты выборки из бд. и $tag = getRequest('q'); Это UMI CMS.

Но дело чуток не в этом. Судя по тому, что в javascript прилетает NULL вместо значений, когда массив создан циклом - разница какаято есть. Есть у меня две переменные, в одной массив через цикл, в другой массив ручками. Меняю в строке
PHP:
$json_data = array ('query'=>$tag,'suggestions'=>$result);
эту переменную (вместо $result) и получаю NULL, меняю обратно на переменную с массивом созданным вручную и получаю все окей.
 

hell0w0rd

Продвинутый новичок
Ок. Покажите var_dump'ы того что на выходе. Значит у вас массив генерируется как-то не так. Либо вы парсите json как-то не так
 

talliar

Новичок
Ок. Покажите var_dump'ы того что на выходе. Значит у вас массив генерируется как-то не так. Либо вы парсите json как-то не так
PHP:
foreach ($tags as $one_tag){
		
		

		
		if(stristr($one_tag, $tag) !== false){
				$tags_array[] = $one_tag;
			
		}
		
		
			
		} 
		
	
		
		
	}
		
	$result = array_unique($tags_array);
	

$new_arr=array_values($result);
$mimi = array("dsd","ddd","fdf");




	$json_data = array ("query"=>$tag,"suggestions"=>$new_arr);
	var_dump(json_encode($json_data));
	

exit();
Результат: string(47) "{"query":"d","suggestions":["dsd","ddd","fdf"]}"

Меняю переменную $new_arr на $mimi

PHP:
foreach ($result as $one_page){
	
	 $objects = umiObjectsCollection::getInstance();
	 $one_object = $objects->getObject($one_page);
 
		$tags = $one_object->getValue('tags');
		
	
		

		foreach ($tags as $one_tag){
		
		

		
		if(stristr($one_tag, $tag) !== false){
				$tags_array[] = $one_tag;
			
		}
		
		
			
		} 
		
	
		
		
	}
		
	$result = array_unique($tags_array);
	

$new_arr=array_values($result);
$mimi = array("dsd","ddd","fdf");




	$json_data = array ("query"=>$tag,"suggestions"=>$mimi);
	var_dump(json_encode($json_data));
	

exit();
Результат: string(47) "{"query":"d","suggestions":["dsd","ddd","fdf"]}"


Результат в окне браузера абсолютно одинаков. Приведу код, в который я получаю все это добро:

PHP:
 $.ajax({
                    url: options.serviceUrl,
                    data: options.params,
                    type: 'GET',
                    dataType: 'json'
                }).done(function (data) {
                
                alert(data);
                   
                });
В первом случае я получаю алерт с {"query":null,"suggestions":null} а во втором {"query":"d","suggestions":["dsd","ddd","fdf"]}.

За помощь готов отгрузить бутылочку хорошего алкоголя)))
 

hell0w0rd

Продвинутый новичок
Гм. А попробуйте сменить dataType на html и посмотреть что тогда выйдет. Что-то же должно различаться
 

hell0w0rd

Продвинутый новичок
я извиняюсь, dataType: стоит в 'text', но сути проблемы не меняет,
Блин, вы вырезаете часть кода и ничего не понятно, честно.
Сами взгляните на то что вы пишите со стороны - один и тот же массив суете в функцию, она вам выдает разный результат - не бывает же такого)
 

hell0w0rd

Продвинутый новичок
Попробуйте перед foreach объявить переменные которые заполняются в цикле
 

talliar

Новичок
Попробуйте перед foreach объявить переменные которые заполняются в цикле
Я могу полный код привести, но не думаю что это внесет ясности:

PHP:
public function findTag($tag = NULL){

$tag = getRequest('q');


/*
$sStatIncPath = dirname(dirname(dirname(dirname(__FILE__)))) . '/stat/classes';
$factory = new statisticFactory($sStatIncPath);

			$factory->isValid('allTags');
			$report = $factory->get('allTags');


*/




	$o_object_type = umiObjectTypesCollection::getInstance()->getTypeByGUID('root-pages-type');
	$i_tags_field_id = $o_object_type->getFieldId('tags');
	
	$o_sel = new umiSelection();
	$o_sel->addPropertyFilterLike($i_tags_field_id, $tag, false);
	/* $o_sel->addLimit(1); тут нельзя лимит ставить, потому что может быть 100 тегов со словом сургут например. */ 
	$result = umiSelectionsParser::runSelection($o_sel);
	
/* 	 $tags_array = array(); */
	
	foreach ($result as $one_page){
	
	 $objects = umiObjectsCollection::getInstance();
	 $one_object = $objects->getObject($one_page);
 
		$tags = $one_object->getValue('tags');
		
	
		

		foreach ($tags as $one_tag){
		
		

		
		if(stristr($one_tag, $tag) !== false){
				$tags_array[] = $one_tag;
			
		}
		
		
			
		} 
		
	
		
		
	}
		
	$result = array_unique($tags_array);
	
	

$new_arr=array_values($result);
$mimi = array("dsd","ddd","fdf");



	$json_data = array ("query"=>$tag,"suggestions"=>$mimi);
	echo json_encode($json_data);
	
	
	
	


exit();
	
}

И javascript
PHP:
 $.ajax({
                    url: options.serviceUrl,
                    data: options.params,
                    type: 'GET',
                    dataType: 'text'
                }).done(function (data) {
                
                alert(data);
                    that.processResponse(data, q);
                    options.onSearchComplete.call(that.element, q);
                });

"Попробуйте перед foreach объявить переменные которые заполняются в цикле" - не очень понял
 

hell0w0rd

Продвинутый новичок
Я могу полный код привести, но не думаю что это внесет ясности:
"Попробуйте перед foreach объявить переменные которые заполняются в цикле" - не очень понял
Было:
PHP:
$foos = array(1,2,3);
foreach($foos as $foo){
    $bar[] = $foo;
}
Стало:
PHP:
$bar = array();
$foos = array(1,2,3);
foreach($foos as $foo){
    $bar[] = $foo;
}
В си-языках все что объявлено внутри {} - остается там же. Возможно подобное в php включается какой-нибудь директивой strict_syntax
 

talliar

Новичок
Было:
PHP:
$foos = array(1,2,3);
foreach($foos as $foo){
    $bar[] = $foo;
}
Стало:
PHP:
$bar = array();
$foos = array(1,2,3);
foreach($foos as $foo){
    $bar[] = $foo;
}
В си-языках все что объявлено внутри {} - остается там же. Возможно подобное в php включается какой-нибудь директивой strict_syntax


Ну тогда и в вардампе была бы видна разница)

Попробывал объявить массив явно перед foreach
В вардампе все осталось также, а в алерте яваскрипта вместо NULL теперь просто ничего нет {"query":null,"suggestions":[]}
 

hell0w0rd

Продвинутый новичок
Попробуйте без json_encode, просто вернуть одно и то же. Возможно надо разбираться с экранированием, есть несколько режимов экранирования, при преобразовании в json
 

talliar

Новичок
Попробуйте без json_encode, просто вернуть одно и то же. Возможно надо разбираться с экранированием, есть несколько режимов экранирования, при преобразовании в json
PHP:
$json_data = array ("query"=>$tag,"suggestions"=>$new_arr);
	var_dump($json_data);
Результат:

array(2) { ["query"]=> string(1) "d" ["suggestions"]=> array(3) { [0]=> string(3) "dsd" [1]=> string(3) "ddd" [2]=> string(3) "fdf" } }


PHP:
$json_data = array ("query"=>$tag,"suggestions"=>$mimi);
	var_dump($json_data);
Результат:
array(2) { ["query"]=> string(1) "d" ["suggestions"]=> array(3) { [0]=> string(3) "dsd" [1]=> string(3) "ddd" [2]=> string(3) "fdf" } }
 

hell0w0rd

Продвинутый новичок
Если в браузер вывожу - совершенно. Если передаю в javascript - нет))))
Вы же получаете text. Значит jquery ничего не делает с ответом. Посмотрите профилеровщиком запросов в chrome, какой ответ приходит, возможно что-то подскажет. Может вы запрос отправляете не в utf-8? То есть php обрабатывает строки которые пришли запросом же.
 
Сверху