Использование & quot; класса RecursiveArrayIterator & quot; для подсчета элементов в сложном массиве рекурсивный

Мне нужно подсчитать, сколько пользователей в этом массиве, а также общее количество пользователей выше или ниже массива с использованием библиотеки PHP RecursiveArrayIterator.

Как сделать это считать?

Что мне сейчас нужно для настройки сети (преобразование объекта в массив):

Array
(
[left] =>
[center] => Array
(
[user_id] => 5
[name] => Leo Turner
[username] => ayla.zemlak
[email] => [email protected]
[sponsor] => 1
[indicate] => 1
[network] => Array
(
[left] =>
[center] => Array
(
[user_id] => 8
[name] => Jaiden Simonis
[username] => cgorczany
[email] => [email protected]
[sponsor] => 1
[indicate] =>
[network] => Array
(
[left] =>
[center] =>
[right] =>
)

)

[right] =>
)

)

[right] =>
)

Класс My Tree для нового решения:

<?php

namespace App\Helpers;

class Tree
{
public $total;
public $hasUp;
public $hasDown;
public $id;
public $name;
public $email;
public $username;
public $treeDefault;
public $network;

public function __construct( $id )
{
$this->total = 'total users';
$this->hasUp = 'get user up in array';
$this->hasDown = 'get user down in array';
$this->id = $id;
$this->name = $this->getUser('name');
$this->email = $this->getUser('email');
$this->username = $this->getUser('username');
$this->treeDefault = $this->getTreeJson( $id );
$this->network = $this->getNetwork( $id );
}

/**
* @param $field
* @return mixed
*/
public function getUser( $field )
{
$user = \App\Models\User::where( 'id', $this->id )->first();
return $user[ $field ];
}

/**
* @param null $id
* @return string
*/
public function getTreeJson( $id = null )
{
return json_encode( $this->getNetwork( $id ) );
}

/**
* Mount Tree Array
* @return array
*/
public function getNetwork( $id = null )
{
$hasId = (isset($id) ? $id : $this->id);
$network = \App\Models\Network::where( 'user_id', $hasId )->first();
$tree = json_decode( $network['users'] );
foreach( $tree as $key => $item ) {
$newTree[ $key ] = ($item->user != '' ? new Tree( $item->user ) : null);
}
return (isset($newTree) ? $newTree : null);
}
}

(Сложный для меня, у меня мало опыта)

Спасибо

0

Решение

Быстрое решение, однако без RecursiveArrayIterator:

function calc_users($array) {
static $count = 0;

if (isset($array['center']['network'])) {
calc_users($array['center']['network']);
}

if (isset($array['left']['network'])) {
calc_users($array['left']['network']);
}

if (isset($array['right']['network'])) {
calc_users($array['right']['network']);
}

if (isset($array['left']['user_id'])) {
$count++;
}
if (isset($array['right']['user_id'])) {
$count++;
}
if (isset($array['center']['user_id'])) {
$count++;
}

return $count;
}

$arr = [
'left' =>null,
'center' => [
'user_id' => 1,
'network' => [
'left' =>null,
'center' => [
'user_id' => 1,
'network' => [
'left' =>null,
'center' =>null,
'right' =>null,
]
],
'right' => null
],
],
'right' => ['user_id' => 10, 'network' => []]
];

print_r(calc_users($arr));// print 3
0

Другие решения

Вот решение с использованием RecursiveArrayIterator в комбинации с RecursiveIteratorIterator,

<?php

$networks = [
'left' => [
'user_id' => 5,
'name' => 'User1',
'username' => 'ayla.zemlak',
'email' => '[email protected]',
'sponsor' => 1,
'indicate' => 1,
'network' => [
'left' => '',
'center' => [
'user_id' => 8,
'name' => 'User2',
'username' => 'cgorczany',
'email' => '[email protected]',
'sponsor' => 1,
'indicate' => '',
'network' => [
'left' => '',
'center' => '',
'right' => '',
]
],
'right' => '',
]
],
'center' => [
'user_id' => 5,
'name' => 'User3',
'username' => 'ayla.zemlak',
'email' => '[email protected]',
'sponsor' => 1,
'indicate' => 1,
'network' => [
'left' => '',
'center' => [
'user_id' => 8,
'name' => 'User4',
'username' => 'cgorczany',
'email' => '[email protected]',
'sponsor' => 1,
'indicate' => '',
'network' => [
'left' => '',
'center' => '',
'right' => '',
]
],
'right' => '',
]
],
'right' => [
'user_id' => 8,
'name' => 'User5',
'username' => 'cgorczany',
'email' => '[email protected]',
'sponsor' => 1,
'indicate' => '',
'network' => [
'left' => '',
'center' => '',
'right' => '',
]
],
];

$arrayIterator = new RecursiveArrayIterator($networks);
$usersIterator = new RecursiveIteratorIterator(
$arrayIterator,
RecursiveIteratorIterator::SELF_FIRST
);

foreach ($usersIterator as $key => $user) {
if (in_array($key, ['left', 'center', 'right']) && is_array($user)) {
echo $user['name'] . PHP_EOL;
}
}

Выход будет:

User1
User2
User3
User4
User5

Здесь хитрость заключается в использовании RecursiveIteratorIterator::SELF_FIRST во втором аргументе RecursiveIteratorIterator который в противном случае будет пропущен во время итерации. Пожалуйста, обратитесь к RecursiveIteratorIterator а также RecursiveArrayIterator иметь больше идей.

В приведенном выше фрагменте вы должны настроить код между foreach блок в соответствии с вашими потребностями. Надеюсь, что это дает вам некоторое представление.

Дайте нам знать, если у вас есть какие-либо путаницы, вопросы.

0

РЕШЕНИЕ ДЛЯ ПОЛЬЗОВАТЕЛЕЙ ON UP в массиве:
(Отцовские отношения)

/**
* @return array
*/
public function getHasUp()
{
/*
* Search current user father
* Primary find
*/
$qualify = Network::findQualify( $this->id );

/*
* Set the first list item with a first qualified father
*/
$list[1] = $qualify;

/*
* Mount a list with first father
*/
for( $i = 2; $i <= 10; $i++ ) {
if ( isset($list[$i - 1]) ) {
/*
* Searches the father of item previous
*/
$list[$i] = Network::findQualify( $list[$i - 1] );
}
}

/*
* Removes items with value null
*/
return array_filter($list);
}

Спасибо за вашу помощь

0
По вопросам рекламы [email protected]