Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по PHP оффтопик небольшой (https://javascript.ru/forum/misc/26029-vopros-po-php-offtopik-nebolshojj.html)

Mахmaxmaximus 23.02.2012 03:59

Вопрос по PHP оффтопик небольшой
 
function getCatigories($patch) {

	function name($val) {
		//вот тут я val сравниваю с внешней $patch
		if($val  == $patch){return true;}
		else{return false;}
	}


	return  array_filter(scandir($patch), 'name');
};

//то есть если элемент массива равен 'doors'  то оставить его.
getCatigories('doors');


почему в функции name не видется переменная $patch?


Я хочу чтобы калбак функция которая фильтрует массив имела доступ к одной переменной (именно со значением этой переменной мне и надо сравнивать элементы массива)

Mахmaxmaximus 23.02.2012 04:22

Народ я реал не могу с этим работать!

Я просто хочу отфильтровать массив(((( в фильтраторе массивов я хочу использовать внешнюю переменную, НО У МНЯ НЕТ К НЕЙДОСТУПА!!!! что это за язык то такой!111

Mахmaxmaximus 23.02.2012 05:44

Второй вопрос почему это говно не работает? Жаль все таки что ЗРЗ не умеет работать с JON и что в PHP все криво и ужасно! И дело не в моем незнании а именно в кривости и неинтуитивности PHP!

$qq = json_decode('{"name" : "sasha"}') ;
echo $qq['name'];


вы представляете, это уродство не работает!! ПОЗОР СОЗДАТЕЛЯМ PHP!!

Цитата:

Fatal error: Cannot use object of type stdClass as array in C:\xampp\htdocs\door\door.php on line 3

АДОВО, СРАБОТАЛО $qq -> name . ЭТО АДОВО....

короче у меня батхерд с этого языка!11 прошу всех извенить я спать я не буду учить это чудовище, лучше буду кодить на питоне и на node.js

Octane 23.02.2012 06:01

ты уже ненавидишь PHP на все 146%? :D https://twitter.com/#!/homm86/status/166379169167577088

Mахmaxmaximus 23.02.2012 06:08

Octane,
Помоги а(!! Мне нужно сделать кое что у меня крыша едет с этого языка((((;

echo file_get_contents('./doors/categories.ini'); // {"doo":"ww"}
echo  getCatigories(); // ["doo"]


А ТЕПЕРЬ PHP ИДЕТ В БОЙ!!!!

echo  getCatigories() . file_get_contents('./doors/categories.ini'); /// ?????


Угадайте что выведет???? думаете {"doo":"ww"}["doo"] ????

НОРМАЛЬНЫЙ ЧЗЫК - ДА!! НО ЭТО ЖЕ ПЫХА!11

Она выводит ["doo"]п»ї{"doo":"ww"}


что вто это такое п»ї млять вообще?? я это не писал1!1 я детьми клянусь я не писал такого!!11

при том и файл categories.ini и мой php файл в utf8 кодировке.

я уточню {"doo":"ww"} и ["doo"] это строки JSONa

Octane 23.02.2012 06:13

Я в PHP только header(…) и echo json_encode($array) умею

Mахmaxmaximus 23.02.2012 06:15

Octane,
НИКОГДА, слышашь , ради бога ни когда не пытайся понять этот язык! Я щас яишницу из за него уронил на пол и тарелку разбил а у меня 5 часов ночи.....

В этом языке нет областей видимости....... и нельзя обьявлять переменные.....
при соединении строк строк он добавляет в стыки 3 символа п»ї ...... при том нет доступа к внешним областям видимости, по скольку и областей видимости тоже нет.......... создатели языка просто гении информационных технологий.......

NoResponse 23.02.2012 07:09

ты это не видишь, но оно есть !!! это BOM
с областями видимости я пожалуй соглашусь, через одно место оно :\
вот на для развития http://www.php.ru/manual/language.variables.scope.html

Gvozd 23.02.2012 10:13

Цитата:

Сообщение от Mахmaxmaximus
Я просто хочу отфильтровать массив(((( в фильтраторе массивов я хочу использовать внешнюю переменную, НО У МНЯ НЕТ К НЕЙДОСТУПА!!!! что это за язык то такой!111

Нормальный язык. Просто ты не читаешь документацию к нему.
Почитай внимательно про то как в нем работают замыкания.
А еще почитай про то, что на самом деле возвращает scandir()

Gvozd 23.02.2012 10:15

Цитата:

Сообщение от Mахmaxmaximus
вы представляете, это уродство не работает!! ПОЗОР СОЗДАТЕЛЯМ PHP!!

Повторюсь еще раз.
Читай документацию.
У json_decode есть второй параметр.

Gvozd 23.02.2012 10:19

Цитата:

Сообщение от Mахmaxmaximus
что вто это такое п»ї млять вообще?? я это не писал1!1 я детьми клянусь я не писал такого!!11

Писал-писал.
В текстовых редакторах обычно имеется возможность выбрать сохранять ли BOM, или нет.
И либо ты выбрал сохранять с ним, либо сохранил файл через обычный Notepad.
И есть ты будешь читать этот файл через любой другой язык, то эти три байта там также будут.

Gvozd 23.02.2012 10:23

Цитата:

Сообщение от Mахmaxmaximus
В этом языке нет областей видимости....... и нельзя обьявлять переменные.....
при соединении строк строк он добавляет в стыки 3 символа п»ї ...... при том нет доступа к внешним областям видимости, по скольку и областей видимости тоже нет..........

Все ложь.
Читай документацию
Цитата:

Сообщение от NoResponse
с областями видимости я пожалуй соглашусь, через одно место оно :\

Да ладно?
По-моему как-раз нормально что язык не тянет в локальную область видимости всю хуйню с вышестоящих областей видимости, в том числе и глобальной, а предлагает программисту конкретезировать что именно тянуть.

Gvozd 23.02.2012 10:26

И еще раз напоминаю
Цитата:

Серверным языкам посвящен отдельный раздел форума - http://javascript.ru/forum/server/

vasa_c 23.02.2012 12:26

Mахmaxmaximus, не ты ли предлагал в соседней теме читать документацию перед тем, как делать выводы о языке?

vasa_c 23.02.2012 12:30

В пыхе нет вложенных функций, как в первом сообщении.
function name объявится в глобальном контексте.

но в 5.3 есть анонимные функции:

function getCatigories($patch) {

    $name = function ($val) use $patch { ... }
    // ...
}

Mахmaxmaximus 23.02.2012 14:10

Gvozd,
да, точно спасибо за все. я как раз по докам и работаю. просто я пишу что то роде "как прочитать файл" и попадаю на левый сайт п, там про то как файл считывать.

Но ни слова про параметры и про работу функции. надо порсто найденые функции а официальной доке проверять.

Mахmaxmaximus 23.02.2012 14:13

vasa_c,
научтие меня как мне передать доступ из одной локальной области видимости функции в другую. ретурнами и передачей параметров?

Mахmaxmaximus 23.02.2012 14:24

Цитата:

Сообщение от vasa_c (Сообщение 159362)
В пыхе нет вложенных функций, как в первом сообщении.
function name объявится в глобальном контексте.

но в 5.3 есть анонимные функции:

function getCatigories($patch) {

    $name = function ($val) use $patch { ... }
    // ...
}

Хорошо, у меня пыха 5.2 как мне профильтровать массив сравнивая его элементы с каким то значением которое лежит в переменной? либозамыканием либо гчерез глобальную переменную?
То есть в JS мы все кипятком писаем выкручиваемся лиш бы не засирать глобальную а тут это приветствуется? хотя разницы ни какой нет.

Gvozd 23.02.2012 14:40

Цитата:

Сообщение от Mахmaxmaximus
Хорошо, у меня пыха 5.2 как мне профильтровать массив сравнивая его элементы с каким то значением которое лежит в переменной?

create_function например
Только посмотрите внимательно вывод scandir, ибо ваша исходная задача не решится в таком виде

dmitriymar 23.02.2012 14:52

использовать глобальную переменную в функции в рнр можно 4 способами
uasort(масс,функция)-сортировка массива с использованием пользовательской функции
usort(масс,функция) -для не ассоциативных

vasa_c 23.02.2012 14:57

class Parser
{

    public function __construct($patch) {    
        $this->patch = $patch;    
    }
    
    public function getCategories() {
        return array_filter(scandir($val), array($this, 'callback));
    }
    
    private function callback($val) {
        if ($val == $this->patch) {
            return true;
        } else {
            return false;
        }
    }
    
    private $patch;

}

Gvozd 23.02.2012 14:57

dmitriymar,
Как это поможет?

dmitriymar 23.02.2012 14:59

Gvozd,
насколько я понял ему нужна сортировка массива с использованием его данных. это сортировка массива с использованием пользовательской функции
в принципе аналог array_filter только сортировку производит в самом массиве, а array_filter возвращает отсортированный

devote 23.02.2012 15:17

function getCatigories($patch) {
 
    function name($val) {

        global $patch;

        //вот тут я val сравниваю с внешней $patch
        if($val  == $patch){return true;}
        else{return false;}
    }
 
 
    return  array_filter(scandir($patch), 'name');
};
 
//то есть если элемент массива равен 'doors'  то оставить его.
getCatigories('doors');

Mахmaxmaximus 23.02.2012 17:13

Я получаю имена папок и файлов в одной директории, мне нужно получить массив только папок.

я получаю массив И папок и файлов, и пробегаясь по нему проверяряю что есть файл а что есть папка, и если это папка то засовываю путь в новый массив.

В итоге в новом массиве остаются только пути папок.


в JS это было бы так


function getFoldersArray(patch) {
	
	var arrFolders = [];

	//scandir возвращает массив и папок и файлов
	scandir(patch).forEach(thisPatch)
	{	
		//is_dir проверяет если папка то возвращает true
		if (is_dir(thisPatch)) {
			arrFolders.push(thisPatch);
		}
	}
	
	return arrFolders;
}

var arrayFoldersInDoorsFolder = getFoldersArray("/doors");

vasa_c 23.02.2012 17:17

http://ru2.php.net/glob

Mахmaxmaximus 23.02.2012 17:22

Цитата:

Сообщение от vasa_c
http://ru2.php.net/glob

да, я использую эту функцию для получения картинок.
glob('./doors/*.{jpg,jpeg,png,bmp,gif}', GLOB_BRACE);


я могу выбирать расширения, но
как я могу шаблоном определить папка это или файл?
$dirs = glob("./doors/*", GLOB_ONLYDIR);

Другой вопрос, как получить только файлы?

vasa_c 23.02.2012 17:28

Можно ещё вот это попробовать:
http://ru2.php.net/manual/en/class.d...ryiterator.php
http://ru2.php.net/manual/en/class.r...ryiterator.php
http://ru2.php.net/manual/en/class.r...eriterator.php

Mахmaxmaximus 23.02.2012 17:29

vasa_c,
спасибо огромное! но как получить только файлы?

vasa_c 23.02.2012 18:53

ну видимо придётся обходить всё и смотреть, файл это или нет

Mахmaxmaximus 23.02.2012 18:55

А есть известные причины по которым не сделали такую функцию, а для нахождения папок сделали?

и второй вопрос что такое stdClass почему он не хочет отдавать данные вот так obj['prop']?

Gvozd 23.02.2012 23:10

Цитата:

Сообщение от Mахmaxmaximus
и второй вопрос что такое stdClass почему он не хочет отдавать данные вот так obj['prop']?

stdClass - это просто абстрактный класс, в котором ничего нету.
Используется там, где нужно работать просто с объектом без определенного класса
Например json_decode по-умолчанию(без второго параметра) возвращает объект stdClass
Естественно, что экземпляр этого класса не будет отдавать данные как массив. Нужно использовать номральный синтаксис обращения к свойствам объекта.

Mахmaxmaximus 23.02.2012 23:36

Gvozd,
ясн, а обьект и массив в PHP одно и то же? То есть это один и тот же класс Array?

п.с. как проверить существует ли свойство у $_GET?

property_exists($_GET, 'getCategories')

варнингует
Warning: First parameter must either be an object or the name of an existing class

Gvozd 24.02.2012 00:20

Цитата:

Сообщение от Mахmaxmaximus
ясн, а обьект и массив в PHP одно и то же? То есть это один и тот же класс Array?

Нет.
Массивы не являются объектами.
У них нету ни свойств ни методов, а есть только ключи и соответсвующие им элементы.
Причем ключи могут быть как целочисленные, так и строковые.
В последнем случае - получаем ассоциативный массив, но он не становится от этого объектом.
Получать досту к элементу предполагается таким синтаксисом: $array[0], $array['text_key']

А объекты - они уже имеют свойства, методы и прочая.
Доступ к свойствам и методам осуществляется через -> (или :: для статических)
Экземпляры некоторых классов (реализующих интерфейс ArrayAccess, и при необходимости несколько сопутсвующих) могут использоватся как массивы.
Но это уже будут объекты, а не массивы.
Но это уже из разряда тех кун-гфу: не все знают, и еще меньше используют

monolithed 24.02.2012 00:45

Некоторые мысли на эту тему:

К примеру array_keys(); имеет следующий прототип:
array array_keys ( array $input [, mixed $search_value [, bool $strict = false ]] )


Как мы видим array_keys() имеет тип array.

А вызывается он так array_keys(), а не так array.array_keys() вероятно потому что в заголовочном файле array прописано примерно такая строчка:
using namespace array;

Что создает видимость считать, что array_keys() это отдельная от объекта array функция.
А обращение к элементам массива типа $array[0], это ничто иное как перегруженный оператор [], который имеет реальный член класса типа array::get();

Если честно не понятно почему разработчики php так усердно скрывают реальные типы объектов.

Mахmaxmaximus 24.02.2012 00:49

monolithed,
видимо чтобы не путали массивы с обьектами? нет?

Gvozd 24.02.2012 00:51

monolithed,
Мне кажется что вы взяли все свои предположения с потолка.
Или вы реально читали исходные коды, и все описанное вами видели там?

monolithed 24.02.2012 00:55

Цитата:

Сообщение от Mахmaxmaximus
видимо чтобы не путали массивы с обьектами? нет?

Фактически изнутри у array и есть объект, но они решили сделать его отдельным типом данных, что вполне разумно. К примеру в Python list (аналог массива) имеет тип Тип))

Цитата:

Сообщение от Gvozd
Мне кажется что вы взяли все свои предположения с потолка.

Ну да это только предположения, но предположить внутренне архитектуру частично возможно, учитывая то что он написан на С++

UPD:
Цитата:

Сообщение от Gvozd
Или вы реально читали исходные коды, и все описанное вами видели там?

Посмотрел исходники (какие-то они странные, не смог найти даже парсер) написан он на С, так что все немного по другому)

Gvozd 24.02.2012 01:19

Цитата:

Сообщение от monolithed
Ну да это только предположения, но предположить внутренне архитектуру частично возможно.

Если что, то в исходниках PHP не используются классы и уж тем более неймспейсы - он написан на C

Насколько я понял исходники, в качестве массивов используются структуры типа HashTable, а объекты тип ArrayObject просто содержат в себе экземпляр HashTable, который и подсовывают при использовании их как массивов
Функции высокого уровня, типа array_key_exists() внутри работают именно в процедурном стиле, и более низкоуровневые функции также до последнего принимают одним из параметров HashTable, вплоть до zend_hash_exists, который уже просто пробегается циклом по представленному HashTable

Вот кстати сам HashTable
Код:

typedef struct _hashtable {
        uint nTableSize;
        uint nTableMask;
        uint nNumOfElements;
        ulong nNextFreeElement;
        Bucket *pInternalPointer;        /* Used for element traversal */
        Bucket *pListHead;
        Bucket *pListTail;
        Bucket **arBuckets;
        dtor_func_t pDestructor;
        zend_bool persistent;
        unsigned char nApplyCount;
        zend_bool bApplyProtection;
#if ZEND_DEBUG
        int inconsistent;
#endif
} HashTable;

Набор указателей, и прочей служебной информации.
Весь код обслуживающий его вынесен в отдельные функции, которые принимают массив одним из параметров.
Таким образом array_key_exists() является самостоятельной функцией, принимающей массив одним из аргументов, но не более

monolithed 24.02.2012 01:30

Цитата:

Сообщение от Gvozd
Если что, то в исходниках PHP не используются классы и уж тем более неймспейсы - он написан на C

Есть у меня несколько книг по PHP, в какой-то из них было сказано, что PHP на С++ написан, проверять не стал.
Сейчас скачал исходники действительно на С, только разобраться пока не получилось.


Часовой пояс GMT +3, время: 21:19.