<?php
$arrays = [
[
'foo' => 'bar',
'bar' => 'baz',
'baz' => 'foo',
],
[
'foo' => 'bar',
'baz' => 'foo',
],
[
'foo' => 'bar',
'bar' => 'baz',
],
];
function check_keys(array $input, array $keys)
{
return array_intersect($keys, array_keys($input)) === $keys;
}
var_dump(check_keys($arrays[0], ['foo', 'baz', 'bar']));
var_dump(check_keys($arrays[1], ['foo', 'baz']));
var_dump(check_keys($arrays[2], ['foo', 'bar']));
var_dump(check_keys($arrays[2], ['baz', 'bar']));
bool(true)
bool(true)
bool(true)
bool(false)
// store
const initalState = {
treesById: {},
activeByTreeId: {},
};
const treesReducer = (state, action) => {
switch (action.type) {
// store.dispatch({ type: 'ADD_TREE', id: 'users', tree: [...] })
case 'ADD_TREE':
return {
...state,
treesById: {
...state.treesById,
[action.id]: action.tree,
},
};
// store.dispatch({ type: 'SET_ACTIVE', id: 'users', value: 5 })
case 'SET_ACTIVE':
return {
...state,
activeByTreeId: {
...state.activeByTreeId,
[action.id]: action.value,
},
};
default:
return state;
}
};
// dumb component aka presenter
const Tree = ({ items, active }) => {
return (
<div className="tree-items">
{items.map((item) => (
<TreeItem
key={item.id}
item={item}
isActive={item.id === active}
/>
))}
</div>
);
};
// smart component aka container
// (state, ownProps)
const mapStateToProps = ({ trees }, { treeId }) => {
return {
items: trees.treesById[treeId] || [],
active: trees.activeByTreeId[treeId],
};
};
// use in any component, e.g. Sidebar (presenter)
// props are passed from container
const Sidebar = () => {
return (
<div className="sidebar">
<TreeContainer treeId="sidebar" />
</div>
);
};
<?php
$data = <<<DOM
<div class="container">
<div class="catalog-list">
<div class="sub">
<div class="item"></div>
</div>
<div class="item"></div>
<div class="item"></div>
<div class="item" data-type="2"></div>
</div>
</div>
DOM;
$xml = new SimpleXMLElement($data);
$catalogListNodes = $xml->xpath('//*[@class="catalog-list"]/*');
$itemInSubNodes = $xml->xpath('//*[@class="sub"]/*[@class="item"]');