Обычный и ассоциированный массив

StalkerClasses

Новичок
Есть два массива:
PHP:
<?php
    // Первый варант
    $ar = [[1,2,3,4,5]];

    
    // Второй варант
    $ar= [];
    $ar[0] = [[1,2,3,4,5]];
    $ar[1] = ['id','in',[1,2,3,4,5]];
?>
Можно ли читая цикл как-то понять каким образом заполнен массив - что это за заполнение многомерное (второй вариант) или обычное (первый вариант). Т.е. различить массивы по варианту заполнения.

В первом случае будет выведено $ar[0][0] = 1 и во втором случае будет выведено $ar[0][0] = 1;
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Первый вариант у тебя тоже многомерный массив =D
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Вчитался повнимательнее, и понял, что ты путаешь ассоциативные, многомерные и одноуровневые массивы =( Это прям беда печаль
 

StalkerClasses

Новичок
Вчитался повнимательнее, и понял, что ты путаешь ассоциативные, многомерные и одноуровневые массивы =( Это прям беда печаль
Можно как-то понять что это разные типы массивов?
Или это с точки зрения PHP многомерные массивы?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Можно, когда ты сам понимаешь где и что. Пока, увы - нет.

Коротко:

[1,2,3,4] - массив

[1,2, [1,2, хрень пойми чо ...], ...] - уже "массив массивов", то есть многомерка
 

StalkerClasses

Новичок
Как отличить этот массив от этого?
$ar = [1,2,3,4,5];
$ar[0] = [1,2,3,4,5];

Как поймете что это многомерный?
Скобочки лишние убрал.
 

StalkerClasses

Новичок
Не пойдет...
Предистория - мне очень нравится то, как организован фильтр в битриксе.
PHP:
$arFilter = array(
    "IBLOCK_ID" => $IBLOCK_ID,
    "SECTION_CODE" => "orange",
    "INCLUDE_SUBSECTIONS" => "Y",
    array(
        "LOGIC" => "OR",
        array("<PROPERTY_RADIUS" => 50, "=PROPERTY_CONDITION" => "Y"),
        array(">=PROPERTY_RADIUS" => 50, "!=PROPERTY_CONDITION" => "Y"),
    ),
);

$res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>50), $arSelect);
Вот сама вот эта переменная $arFilter.
Но с точки зрения вложенности это очень тяжело читается.

В ларавел
PHP:
$rows = Pages::recSelect('get', function ($q) use ($filter){
    $q->select(['uid','title']);
    $q->whereHas('eav_attr_rows_func', function ($q) use ($filter){
        $q->where('eav_attr_key','=','page@ext-name@prop-input');
        $q->whereHas('eav_attr_value_rows_func', function ($q) use ($filter){
            $q->where('eav_attr_value','=','Love');
        });
    });
});
конструкции запросов тоже не очень то, читаются - это просто пример....

Поэтому пробую перевести на массив Laravel ORM.

PHP:
$filter = [];
$filter['distinct'] = 'title';
$filter['select'] = ['uid','title', 'uid as aliasID'];
$filter['addSelect'] = ['pid','date_create'];

$filter['whereUid'] = 1; // Dynamic
$filter['wherePid'] = 1; // Dynamic
$filter['whereTitle'] = []; // Dynamic
$filter['whereFieldName'] = []; // Dynamic

$filter['where.Ar'] = []; // orWhere, =, <, >, <=, >=, <>, !=, LIKE, NOT LIKE, BETWEEN, ILIKE
$filter['where.Ar'][] = ['uid','>=',1];
$filter['where.Ar'][] = ['uid','<=',10000];

$filter['where'] = function($q) {
    $q->where('pid','>=',0);
    $q->orWhere('pid','<=',0);
};

$filter['whereIn'] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // orWhereIn, whereNotIn, orWhereNotIn
$filter['whereNull'] = 'keywords'; // orWhereNull, whereNotNull, orWhereNotNull
$filter['whereBetween'] = ['uid',[1,1000]]; // whereNotBetween
$filter['whereColumn'] = ['uid','!=','title'];
$filter['whereRaw'] = ['(uid > ? and uid < ?)', [1,1000]]; // DB::raw(1)

$filter['whereRaw.Ar'] = [];
$filter['whereRaw.Ar'][] = ["FROM_UNIXTIME(date_create, '%j') = ?", 11]; // %d -> with zero
$filter['whereRaw.Ar'][] = ["FROM_UNIXTIME(date_create, '%n') = ?", 1]; // %m -> with zero
$filter['whereRaw.Ar'][] = ["FROM_UNIXTIME(date_create, '%Y') = ?", 2021];

$filter['whereExists'] = function($q) { // ->orWhereExists(), ->whereNotExists(), ->orWhereNotExists()
    $q->select(DB::raw(1))->from('pages')->whereRaw('uid > 0');
};

$filter['inRandomOrder'] = false; // true
$filter['orderBy.Ar'] = [];
$filter['orderBy.Ar'][] = ['uid','desc'];
$filter['orderBy.Ar'][] = ['title','desc'];
$filter['groupBy'] = 'title';

$filter['limit'] = 3;
$filter['offset'] = 0;
$filter['having'] = ['aliasID', '>', 0]; // orHaving, havingRaw

$filter['with.Ar'] = []; // has, whereHas, doesntHave, whereDoesntHave, withCount
$filter['with.Ar'][]  = [
    'exampletable1_row_func' => function($q) {
        $q->with('exampletable_row_id_func');
        $q->where('uid','>',0);
        $q->where('pid','>',0);
    }
];

$filter['with.Ar'][] = 'exampletable2_rows_func.exampletable_row_id_func';
$filter['with.Ar'][] = 'exampletable3_row_id_func';
$filter['with.Ar'][] = 'exampletable4_rows_func';

#$filter['union'] = ['']; // unionAll // $subQ = NewTable::recSelect('obj', $filter);
#$filter['join'] = ['contacts', 'users.id', '=', 'contacts.user_id'];
#$filter['leftJoin'] = ['posts', 'users.id', '=', 'posts.user_id'];
#$filter['crossJoin'] = 'posts';

$filter['withoutGlobalScopes'] = true;
$filter['withoutGlobalScope'] = ['FlagDeleted','FlagDeleted','DateStart', 'DateEnd'];

$filter['userPagination'] = [30,1]; // $pageLimit, $pageNumber
$filter['userWhereFlagDeleted'] = [0,1]; // 0, 1, [0,1]
$filter['userWhereFlagDisabled'] = [0,1]; // 0, 1, [0,1]

$sql = NewTable::recSelect('toSql', $filter);
$count = NewTable::recSelect('count', $filter);
$rows = NewTable::recSelect('get', $filter);

print "Sql: " . $sql . "<hr />";
print "Count: " . $count . "<hr />";
foreach ($rows as $row) {
    print $row['title'] . " // ";
    print $row['[relname]_row(s)_func']['title'] . "<br />";
}
1) Вот как Вы отличите читая что перед вами в текущий момент в $filter значение параметра?

Код:
$filter['limit'] = 3; // здесь число - это не массив
$filter['inRandomOrder'] = false; // здесь тоже не массив
$filter['distinct'] = 'title'; // здесь тоже не массив
Как ниже вот это различить?
Код:
$filter['whereIn'] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // Здесь просто массив...
$filter['whereIn.Ar'][0] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // А здесь уже вложенный массив!
$filter['whereIn.Ar'][1] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // И здесь уже вложенный массив!
Мне что бы их как-то различить эти "whereIn" пришлось добавить к ключу массива параметр ".Ar".
Хотелось бы от этого избавиться...
 

StalkerClasses

Новичок
И как я пойму где первый вариант, а где второй - они оба is_array()
PHP:
$filter['whereIn'] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // Здесь просто массив...
if(is_array($filter['whereIn']) && ???){
  // TYPE ONE
}

$filter['whereIn'][0] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // А здесь уже вложенный массив!
$filter['whereIn'][1] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // И здесь уже вложенный массив!

if(is_array($filter['whereIn']) && ???){
    // TYPE TWO
}
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Бинго...

Вопрос, зачем тебе их различать?
 

StalkerClasses

Новичок
PHP:
// $filter['whereIn'] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // Здесь просто массив...
if(is_array($filter['whereIn']) && ???){
  // Сценарий 1

// $filter['whereIn'][0] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // А здесь уже вложенный массив!
// $filter['whereIn'][1] = ['uid',[1,2,3,4,5,6,7,8,9,10]]; // И здесь уже вложенный массив!
} elseif(is_array($filter['whereIn']) && ???){
  // Сценарий 1
   
} else {
   
}
Всегда попадаю на // Сценарий 1
 
Последнее редактирование:
Сверху