Помощь с многомерным массивом
173 сообщения
#14 лет назад
Добрый день, нужна помощь специалистов по php, генерируется вот такой массивArray
(
=> Array
(
=> Array
(
=> ZkF7bGdvOEWmEh51Fg6uCQ
=> a_5Ux2h_tEGuC9q0idt23A
=> Иванов Иван
=> none
)
=> Array
(
=> p4yUlTh-v0uAMqnMTaMtsA
=> a_5Ux2h_tEGuC9q0idt23A
=> Петров Петр
=> none
)
=> Array
(
=> Vjy0fnx2fESM-jr6oZuOuw
=> a_5Ux2h_tEGuC9q0idt23A
=> Сидоров Сидр
=> none
)
)
=> 3
)
А в переменной $name лежит одно из этих имен, требуется вытащить тот вложенный массив, в котором содержится имя из переменной. Например $name = "Сидоров Сидр";
чтобы вытаскивался вот этот массив
Array
(
=> Vjy0fnx2fESM-jr6oZuOuw
=> a_5Ux2h_tEGuC9q0idt23A
=> Сидоров Сидр
=> none
)
2817 сообщений
#14 лет назад
Если в $arrayX - генерированный массив, а в $arrayY - массив который будет содержать результат с нужним $name, можно попробовать:$arrayY = array();
foreach($arrayX as $values){
if($values == $name){
$arrayY = $values;
break;
}
}
// если совпадение было, то результат будет в $arrayY
Как-то так )
Дальше допилить если есть какие-то дополнительные условия.
58 сообщений
#14 лет назад
In_array вам в помощь...
// $fullArray - весь массив
$searchName = "Сидоров Сидр";
$searchArray = array();
foreach ($fullArray as $arrayOne ) {
if (in_array($searchName, $arrayOne)) {
$searchArray = $arrayOne;
}
}
3240 сообщений
#14 лет назад
shandy, in_array в этой задаче нельзя использовать, так как тогда будет возможно получение неправильного результата (например в случае ТС, если Id первого элемента будет равно "Сидоров Сидр", то будет выбран именно первый лемент, а не третий, как это ожидается).Предыдущий вариант от kirilev — правильный.
58 сообщений
#14 лет назад
Цитата ("tvv"):shandy, in_array в этой задаче нельзя использовать, так как тогда будет возможно получение неправильного результата (например в случае ТС, если Id первого элемента будет равно "Сидоров Сидр", то будет выбран именно первый лемент, а не третий, как это ожидается).
Предыдущий вариант от kirilev — правильный.
Это я понимаю )) но просто подумал это глупо хранить и в id имя и в поле DisplayName имя, то есть я подразумеваю что исходный массив именно с такой структурой как у ТС...
Даже в принципе если и предположить, что id первого элемента и равно "Сидоров Сидр", то все равно будет выбран 3 вариант - так как я не сделал break, как у kirilev. ))
Если уже так придираться, то правильнее не break делать а собирать в массив найденные массивы с искомым элементом. А потом обрабатывать его как надо - если пустой - то ничего не найдено, если 1,2,.... дополнительная фильтрация (если нужен 1 массив)... В общем тут надо по исходной задачи смотреть, in_array() будет нужен если нам неизвестны имена ключей или они рандомны, $values - это если известно...
1649 сообщений
#14 лет назад
shandy, метод который предоставил kirilev лучше вашего 
tvv прав. Исключения могут быть всегда.
58 сообщений
#14 лет назад
Цитата ("WebDesignStudio"):shandy, метод который предоставил kirilev лучше вашего
tvv прав. Исключения могут быть всегда.
Да никто и не спорит ). Но в данном примере массива оба варианта отработают одинаково...
3240 сообщений
#14 лет назад
Цитата ("shandy"):Даже в принципе если и предположить, что id первого элемента и равно "Сидоров Сидр", то все равно будет выбран 3 вариант - так как я не сделал break, как у kirilev. ))
Если уже так придираться, то правильнее не break делать а собирать в массив найденные массивы с искомым элементом.
Да, в Вашем случае на данном наборе данных будет возвращен последний элемент, в результате полного перебора массива. Но если первый и третий элемент поменять местами, то будет работать неправильно (то есть если например id первого будет равен DisplayName третьего).
Да, это маловероятно, что id первого элемента будет равно "Сидоров Сидр", хоть это и возможно, ну да ладно.
Но вот например весьма возможно, что id будет пустым значением. Или любое другое поле будет пустым значением. И тогда, если Вашим способом искать элемент с пустым DisplayName, то вместо него выведется последний элемент с любым(!) пустым значением любого поля.
Далее.
Как раз-таки правильнее делать break после того, как элемент найден.
Ведь зачем же перебирать остаток массива (который в реальности может быть весьма большим), если уже найдено то, что искали?
Тем более, что это довольно дорогой перебор, так как для каждого элемента массива идет тяжелая сложная операция сравнения строк.
То, что Вы не делаете break, это еще один минус Вашего решения.
Еще один минус Вашего решения — in_array отработает значительно медленнее, чем $values == $name.
В общем, это в любом случае неприемлемое решение, даже если бы оно работало правильно, но оно и так работает неправильно.
Повторюсь, предыдущий вариант от kirilev — правильный.